本文共 2838 字,大约阅读时间需要 9 分钟。
最近有个APP项目,为了避免数据网络传输过程中明文传输,需要采用https协议进行APP端和服务端的数据交互。没有去专门第三方的证书签发机构申请证书,而是自己通过jdk提供的keytool自己给自己签发了一个证书,就APP端使用,没用在浏览器中,也无所谓啦。
使用JDK的keytool工具生成jks密码库。
keytool -genkey -alias tomcat -keyalg RSA -validity 365 -keystore /home/kuanrf/itclj.keystore#输入keystore密码Enter keystore password:#再次输入keystore密码Re-enter new password:#输入你的姓名What is your first and last name? [Unknown]: itclj#输入你的单位名称What is the name of your organizational unit? [Unknown]: itclj.com#输入你的组织名称What is the name of your organization? [Unknown]: itclj.com#你所在城市What is the name of your City or Locality? [Unknown]: chongqing#你所在省份What is the name of your State or Province? [Unknown]: chongqing#两位小写字母表示的国家代码What is the two-letter country code for this unit? [Unknown]: cnIs CN=itclj, OU=itclj.com, O=itclj.com, L=chongqing, ST=chongqing, C=cn correct?#是否确认信息 [no]: y#输入的主密码,这项较为重要,会在tomcat配置文件中使用,#建议输入与keystore的密码一致,设置其它密码也可以,完成上述输入后,#直接回车则在你在定义的位置找到生成的文件Enter key password for (RETURN if same as keystore password):Re-enter new password:
keytool参数说明
-alias tomcat:定义别名为tomcat
-keyalg RSA:加密方式为RSA加密 -validity 365:证书有效期365天,单位(天) -keystore /home/kuanrf/itclj.keystore:证书文件存储位置打开Tomcat根目录下的/conf/server.xml,找到Connector port=”8443”配置段,修改为如下。
http协议端口配置
https协议端口配置
到这里通过tomcat实现ssl加密传输也就可以使用了。但是这种证书配置在tomcat中有很多弊端,不能开启apr运行模式,只能运行在nio模型下。不能用Nginx实现loadbalance,因为Nginx是实现在网络层的第七层的,无法实现https透传,https解码必须在Nginx上进行,解码后再把解码后的信息传给下后边的tomcat。要把tomcat中的https配置前移到Nginx中需要做下面这些步骤的处理。
从一个JKS的keystore中导出public key (certificate)
keytool -export -alias tomcat -keystore /home/kuanrf/itclj.keystore -file itclj.crtEnter keystore password:Certificate stored in file
转换成PEM格式
openssl x509 -out itclj-pem.crt -outform pem -text -in /home/kuanrf/itclj.crt -inform der
导出private key: ,编译后运行
javac ExportPriv.java
java ExportPriv> exported-pkcs8.key
ExportPriv 参数说明:
keystore:jks的keystore文件 alias:keystore别名 password:keystore密码 exported-pkcs8.key:导出的私钥java ExportPriv /home/kuanrf/itclj.keystore tomcat 123456 > /home/kuanrf/itclj-pkcs8.key
上述得到的private key是PKCS#8 PEM格式,使用如下命令才能转换成apache可以使用的RSA格式
openssl pkcs8 -inform PEM -nocrypt -in itclj-pkcs8.key -out itclj.key
upstream ssl.itclj.com { server 127.0.0.1:8680; }
server { listen 443 ssl; server_name api.itclj.com; ssl on; ssl_certificate /home/kuanrf/itclj-pem.crt; ssl_certificate_key /home/kuanrf/itclj.key; location / { #注意是http协议,而不是https proxy_pass http://ssl.itclj.com; proxy_set_header X-Real-IP $remote_addr; } }
https配置至此已经迁移到了Nginx,现在只需要把tomcat的Connector port=”8443”配置项去掉即可。tomcat可以开启apr运行模式,也可以通过Nginx实现loadbalance了。