一、背景介绍
最近有个APP项目,为了避免数据网络传输过程中明文传输,需要采用https协议进行APP端和服务端的数据交互。没有去专门第三方的证书签发机构申请证书,而是自己通过jdk提供的keytool自己给自己签发了一个证书,就APP端使用,没用在浏览器中,也无所谓啦。
二、jks格式证书获取
使用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]: cn
Is CN=itclj, OU=itclj.com, O=itclj.com, L=chongqing, ST=chongqing, C=cn correct?
#是否确认信息
[no]: y
#输入<tomcat>的主密码,这项较为重要,会在tomcat配置文件中使用,
#建议输入与keystore的密码一致,设置其它密码也可以,完成上述输入后,
#直接回车则在你在定义的位置找到生成的文件
Enter key password for <tomcat>
(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:证书文件存储位置
三、jks格式证书在tomcat中配置
打开Tomcat根目录下的/conf/server.xml,找到Connector port=”8443”配置段,修改为如下。
http协议端口配置
<Connector port="8680" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
/>
https协议端口配置
<Connector port="8443"
protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150"
SSLEnabled="true"
scheme="https"
secure="true"
clientAuth="false"
sslProtocol="TLS"
keystoreFile="/home/kuanrf/itclj.keystore"
keystorePass="123456"
/>
到这里通过tomcat实现ssl加密传输也就可以使用了。但是这种证书配置在tomcat中有很多弊端,不能开启apr运行模式,只能运行在nio模型下。不能用Nginx实现loadbalance,因为Nginx是实现在网络层的第七层的,无法实现https透传,https解码必须在Nginx上进行,解码后再把解码后的信息传给下后边的tomcat。要把tomcat中的https配置前移到Nginx中需要做下面这些步骤的处理。
四、jks格式转换为pem格式证书
从一个JKS的keystore中导出public key (certificate)
keytool -export -alias tomcat -keystore /home/kuanrf/itclj.keystore -file itclj.crt
Enter keystore password:
Certificate stored in file <itclj.crt>
转换成PEM格式
openssl x509 -out itclj-pem.crt -outform pem -text -in /home/kuanrf/itclj.crt -inform der
导出private key: 下载文件ExportPriv.java,编译后运行
javac ExportPriv.java
java ExportPriv <keystore> <alias> <password> > 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
五、pem格式证书在nginx中配置
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了。