https配置从tomcat迁移到Nginx

一、背景介绍

最近有个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配置文件中使用,
#建议输入与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:证书文件存储位置

三、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了。

六、逻辑图

https配置从tomcat迁移到Nginx_第1张图片

你可能感兴趣的:(tomcat,nginx,ssl)