前言:
最近在做华为NB-IoT接口开发,需要用到双向认证,就去学了一下。
然后我将过程总结了一下。
里面一些ca.jks和outgoing.CertwithKey.pkcs12相关步骤能看懂就看,看不懂没关系。
一:为服务器生成证书
1. 找到jdk安装目录,运行控制台,切换到该目录:
2、使用keytool命令生成证书tomcat.keystore
keytool -genkey -v -alias tomcat -keyalg RSA -keystore tomcat.keystore -validity 36500
以下是命令的参数介绍
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
三:让服务器信任客户端证书
由于不能直接将PKCS12格式的证书库导入,必须先把客户端证书导出为一个单独的CER文件
1. 将client.p12转换成client.cer;
keytool -export -alias client -keystore client.p12 -storetype PKCS12 -rfc -file client.cer
2. 将client.cer导入到tomcat的信任证书链中
keytool -import -alias client-v -file client.cer -keystore tomcat.keystore
完成之后通过list命令查看服务器的证书库,
可以看到两个证书,一个是服务器证书,一个是受信任的客户端证书:
keytool -list -v -keystore tomcat.keystore
四:让客户端信任服务器证书
由于是双向SSL认证
(1)、客户端也要验证服务器证书,因此,必须把服务器证书添加到浏览器的“受信任的根证书颁发机构”
(2)、服务器也要验证客户端提供的证书,因此,必须把client.p12证书添加到浏览器的“个人”证书里面(这步非常关键)。
由于不能直接将keystore格式的证书库导入,必须先把服务器证书导出为一个单独的CER文件
1. 把tomcat证书导出为tomcat.cer文件(导出根证书)
keytool -export -v -alias tomcat -file tomcat.cer -keystore tomcat.keystore
2、将tomcat.cer证书导入到受信任的根证书颁发机构,点击导入,按照步骤添加
然后一直下一步,最后选“是”
3、将client.p12添加到个人证书
然后一直下一步,最后选“是”。密码是之前生成客户端证书时候的密码。
五、配置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”试下单向认证。博主试过了可以成功。
不懂欢迎提问!尽力解答