前言:

最近在做华为NB-IoT接口开发,需要用到双向认证,就去学了一下。

然后我将过程总结了一下。

 

里面一些ca.jks和outgoing.CertwithKey.pkcs12相关步骤能看懂就看,看不懂没关系。

 

一:为服务器生成证书

1. 找到jdk安装目录,运行控制台,切换到该目录:

java 签章 java自签名证书_服务器

2、使用keytool命令生成证书tomcat.keystore

keytool -genkey -v -alias tomcat -keyalg RSA -keystore tomcat.keystore -validity 36500

java 签章 java自签名证书_java 签章_02

 

以下是命令的参数介绍

keytool 

-genkey 

-alias tomcat(别名) 

-keypass 123456(别名密码) 

-keyalg RSA(算法) 

-keysize 1024(密钥长度) 

-validity 365(有效期,天单位) 

-keystore tomcat.keystore(指定生成证书的位置和证书名称) 

-storepass 123456(获取keystore信息的密码)

二:为客户端生成证书

1. 生成客户端证书:client.p12(为浏览器生成证书,以便让服务器来验证它。为了能将证书顺利导入至IE和Firefox,证书格式应该是PKCS12)

keytool -genkey -v -alias client -keyalg RSA -storetype PKCS12 -keystore client.p12 -validity 36500

java 签章 java自签名证书_jdk生成自签发证书_03

三:让服务器信任客户端证书

由于不能直接将PKCS12格式的证书库导入,必须先把客户端证书导出为一个单独的CER文件

1. 将client.p12转换成client.cer;

keytool -export -alias client -keystore client.p12 -storetype PKCS12 -rfc -file client.cer

java 签章 java自签名证书_客户端_04

2. 将client.cer导入到tomcat的信任证书链中

keytool -import -alias client-v -file client.cer -keystore tomcat.keystore

 

java 签章 java自签名证书_tomcat_05

完成之后通过list命令查看服务器的证书库,

可以看到两个证书,一个是服务器证书,一个是受信任的客户端证书:

keytool -list -v -keystore tomcat.keystore

java 签章 java自签名证书_jdk生成自签发证书_06

四:让客户端信任服务器证书

由于是双向SSL认证

(1)、客户端也要验证服务器证书,因此,必须把服务器证书添加到浏览器的“受信任的根证书颁发机构”

(2)、服务器也要验证客户端提供的证书,因此,必须把client.p12证书添加到浏览器的“个人”证书里面(这步非常关键)。

由于不能直接将keystore格式的证书库导入,必须先把服务器证书导出为一个单独的CER文件

1. 把tomcat证书导出为tomcat.cer文件(导出根证书)

keytool -export -v -alias tomcat -file tomcat.cer -keystore tomcat.keystore

java 签章 java自签名证书_服务器_07

2、将tomcat.cer证书导入到受信任的根证书颁发机构,点击导入,按照步骤添加

java 签章 java自签名证书_客户端_08

java 签章 java自签名证书_java 签章_09

然后一直下一步,最后选“是”

3、将client.p12添加到个人证书

java 签章 java自签名证书_tomcat_10

java 签章 java自签名证书_客户端_11

java 签章 java自签名证书_java 签章_12

java 签章 java自签名证书_tomcat_13

然后一直下一步,最后选“是”。密码是之前生成客户端证书时候的密码。

五、配置tomcat的server.xml

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
               redirectPort="8443" SSLEnabled="true" scheme="https" secure="true" clientAuth="true" sslProtocol="TLS"
               keystoreFile="C:\Program Files\Apache Software Foundation\Tomcat 8.5\tomcat.keystore" keystorePass="123456"
               truststoreFile="C:\Program Files\Apache Software Foundation\Tomcat 8.5\tomcat.keystore" truststorePass="123456"
               />

Connector标签中的属性说明:

clientAuth:设置是否双向验证,默认为false,设置为true代表双向验证

keystoreFile:服务器证书文件路径

keystorePass:服务器证书密码

truststoreFile:用来验证客户端证书的根证书,此例中就是服务器证书

truststorePass:根证书密码

 

最后访问8080端口,试下双向是否成功,然后将clientAuth=“false”试下单向认证。博主试过了可以成功。

 

不懂欢迎提问!尽力解答