理论很简单,过程很曲折,版本适配的问题要小心。
场景:
要和前端进行联调,我本地后端用了https,证书是自制的,主要是页面里面有一些oauth2认证的地方,需要跳转。
比如https://aaa.com/profile.html,认证通过之后要跳转到这个页面。
前端的电脑,直接访问后台的页面都是正常的,于是要加域名来实现上面的需求。
后端的电脑配置hosts,192.168.1.1 aaa.com
前端的电脑配置127.0.0.1 aaa.com
然后使用nginx代理,难点在于tomcat自制的jks证书不是nginx支持的,所以要进行转换。
转换的时候要用到openssl,注意其中有一个算法的问题,最好使用openssl旧版本,1.xxx,用新版本会涉及到一个算法不支持的问题,还需要调整。主要是我调整了没有成功,缺少对应的库。
keytool -list -keystore server.jks
会使用到里面的srcalias,不过用不用这个命令都可以,因为tomcat证书,后端肯定是配置了alias,用的就是配置的server.ssl.key-alias=tomcat。
2.将jks文件导出为Nginx所需要的文件.crt和.key
2.1 将”.jks”转为”.p12”(PKCS12格式的证书库)
keytool -importkeystore -srckeystore oldkeystore.jks -srcalias tomcat -destkeystore newkeystore.p12 -deststoretype PKCS12
查看新格式(pkcs12)证书库
keytool -deststoretype PKCS12 -keystore newkeystore.p12 -list
2.2提取证书
openssl pkcs12 -in newkeystore.p12 -nokeys -clcerts -out server-ssl.crt
openssl pkcs12 -in newkeystore.p12 -nokeys -cacerts -out gs_intermediate_ca.crt
server-ssl.crt是SSL证书,gs_intermediate_ca.crt是中级证书,俩个合并到一起才是nginx服务器所需要的证书
2.3合并证书
cat server-ssl.crt gs_intermediate_ca.crt >server.crt
此时server.crt是一个完成的证书
合并证书这里使用的是cat命令,其实就是两个证书的输出合并到同一个里面,但是我的不知道为什么gs_intermediate_ca.crt这个是空的,所以等于server.crt 就是 server-ssl.crt
2.4提取私钥
openssl pkcs12 -nocerts -nodes -in newkeystore.p12 -out server.key
server {listen 443 ssl;server_name aaa.com;#charset koi8-r;#access_log logs/host.access.log main;ssl_certificate server.crt;ssl_certificate_key server.key;location / {proxy_pass https://192.168.1.1:443; # 将请求转发到 https://example.comproxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;# SSL specific settingsproxy_ssl_verify off; # 如果你信任目标服务器,可以关闭 SSL 验证# proxy_ssl_trusted_certificate /path/to/trusted/ca/certs; # 如果启用 SSL 验证,指定受信任的 CA 证书# proxy_ssl_verify_depth 2; # SSL 验证的深度}
nginx用的是1.18版本,注意证书配置位置是相对conf的位置。