前言:

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

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

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

 

相关华为论坛链接:http://developer.huawei.com/ict/forum/thread-25457.html

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

 

一:为服务器生成证书 1. 找到jdk安装目录,运行控制台,切换到该目录: 使用jdk生成自签发证书(过程总结) Safe 第1张

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

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

使用jdk生成自签发证书(过程总结) Safe 第2张

 

以下是命令的参数介绍

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 使用jdk生成自签发证书(过程总结) Safe 第3张 三:让服务器信任客户端证书

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

1. 将client.p12转换成client.cer; keytool -export -alias client -keystore client.p12 -storetype PKCS12 -rfc -file client.cer 使用jdk生成自签发证书(过程总结) Safe 第4张 2. 将client.cer导入到tomcat的信任证书链中 keytool -import -alias client-v -file client.cer -keystore tomcat.keystore   使用jdk生成自签发证书(过程总结) Safe 第5张

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

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

keytool -list -v -keystore tomcat.keystore

使用jdk生成自签发证书(过程总结) Safe 第6张

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

由于是双向SSL认证

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

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

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

1. 把tomcat证书导出为tomcat.cer文件(导出根证书) keytool -export -v -alias tomcat -file tomcat.cer -keystore tomcat.keystore 使用jdk生成自签发证书(过程总结) Safe 第7张

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

使用jdk生成自签发证书(过程总结) Safe 第8张

使用jdk生成自签发证书(过程总结) Safe 第9张然后一直下一步,最后选“是”

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

使用jdk生成自签发证书(过程总结) Safe 第10张使用jdk生成自签发证书(过程总结) Safe 第11张

使用jdk生成自签发证书(过程总结) Safe 第12张使用jdk生成自签发证书(过程总结) Safe 第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”试下单向认证。博主试过了可以成功。   不懂欢迎提问!尽力解答   最后附上权威机构颁发证书的认证方法(单向认证): http://www.cnblogs.com/longLifeFrog/p/9067147.html
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄