当我们的服务端部署完成运行起来之后,trustStore信任库已经建立,受信任的客户端证书已经确定下来,如果我们想再添加一个受信任的客户端证书,又不想停掉服务端,这时就可以使用个人CA根证书签发二级证书的方法。当然官方CA更好,但是相比个人CA官方CA不太方便。
其实还有一个方法实现动态添加服务端信任的客户端证书,就是用代码实现trustStore信任库热加载,网上也有相关的文章,但是相比签发二级证书的方式,性能低很多,也麻烦很多。因为每次服务端的认证都会触发服务端扫描trustStore信任库,判断当前访问的客户端是否在信任库内。
本实例假设SSL的单向认证已经建立,已经有了一个server.key.p12服务端keystore。
单向认证可查看连接: https://blog.csdn.net/weixin_41917987/article/details/80987835
本人遇到坑得到的结论,如果你对相关概念不是很明确,可以看一下本人写的上一篇文章开头:https://blog.csdn.net/weixin_41917987/article/details/80988197
1、创建个人CA根证书,用于给需要新添加的客户端证书签名。
keytool -genkey -v -alias ca -keyalg RSA -storetype PKCS12 -keystore E:\7\ca.key.p12
2、将CA根证书导入到服务端的信任库中,本例keyStore和trustStore使用的是一个库,当然也可以使用不同库。
a)导出CA根证书的公钥文件
keytool -keystore E:\7\ca.key.p12-export -alias ca -file E:\7\ca.cer
b)将cer文件导入到trustStore信任库中
keytool -import -v -file E:\7\ca.cer-keystore E:\7\server.key.p12
3、创建客户端证书
keytool -genkey -v -alias qq-keyalg RSA -storetype PKCS12 -keystore E:\7\qq.key.p12
4、使用个人CA根证书给客户端证书签名,因为我们不会将新建的客户端证书导入到服务端的信任库中,但是我们又想让服务端信任新建的客户端证书,那么使用服务端已经信任的CA根证书给新建的客户端证书签名,就可以了。
a)生成签名请求,生成的是一个CSR文件
keytool -certreq -alias qq -keystore E:\7\qq.key.p12-file E:\7\qq.csr -v
b)使用CA根证书给客户端证书签名,得到的cer文件就是签名后的公钥证书
keytool-keystore E:\7\ca.key.p12 -gencert -alias ca -infile E:\7\qq.csr -outfile E:\7\qq.cer
c)将签名后的cer文件导入到qq.key.p12文件中,因为qq.key.p12是客户端证书,需要安装在客户端,但是
qq.key.p12中的公钥文件还是qq签发的,并没有被修改,需要我们将cer文件导回,将原来的公钥替换掉才可以。
keytool -import -v -file E:\7\qq.cer -keystoreE:\7\qq.key.p12
d) 查看被签名后的证书详情,扩展里边证书的发布者已经修改为ca
keytool -list -v -keystore E:\7\qq.key.p12 -storepass qqqq123
5、双击qq.key.p12文件安装新建的客户端证书,安装到个人证书,前面安装过程已有,不再赘述。
6、在springboot的helloworld项目中的application.properties配置文件中配置以下信息,同时将刚生成的server.key.p12文件放到resources目录下,启动项目
server.port=8080 server.ssl.key-store=classpath:server.key.p12 server.ssl.key-store-password=dzm123 server.ssl.key-alias=server server.ssl.keyStoreType=JKS server.ssl.trust-store=classpath:server.key.p12 server.ssl.trust-store-password=dzm123 server.ssl.client-auth=need server.ssl.trust-store-type=JKS server.ssl.trust-store-provider=SUN
可以看到,我们没有将qq.key.p12文件添加到trustStore信任库中,但是qq的证书已经受服务端信任,因为给qq签名的CA根证书已经受trustStore信任。