SpringBoot的SSL个人CA签发二级证书(动态添加客户端证书)

SpringBoot的SSL个人CA签发二级证书(动态添加客户端证书)

当我们的服务端部署完成运行起来之后,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

                SpringBoot的SSL个人CA签发二级证书(动态添加客户端证书)

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

             SpringBoot的SSL个人CA签发二级证书(动态添加客户端证书)

4、使用个人CA根证书给客户端证书签名,因为我们不会将新建的客户端证书导入到服务端的信任库中,但是我们又想让服务端信任新建的客户端证书,那么使用服务端已经信任的CA根证书给新建的客户端证书签名,就可以了。

         a)生成签名请求,生成的是一个CSR文件

            keytool -certreq -alias qq -keystore E:\7\qq.key.p12-file E:\7\qq.csr -v

             SpringBoot的SSL个人CA签发二级证书(动态添加客户端证书)

         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

            SpringBoot的SSL个人CA签发二级证书(动态添加客户端证书)

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信任。


        SpringBoot的SSL个人CA签发二级证书(动态添加客户端证书)


				<script>
					(function(){
						function setArticleH(btnReadmore,posi){
							var winH = $(window).height();
							var articleBox = $("div.article_content");
							var artH = articleBox.height();
							if(artH > winH*posi){
								articleBox.css({
									'height':winH*posi+'px',
									'overflow':'hidden'
								})
								btnReadmore.click(function(){
									articleBox.removeAttr("style");
									$(this).parent().remove();
								})
							}else{
								btnReadmore.parent().remove();
							}
						}
						var btnReadmore = $("#btn-readmore");
						if(btnReadmore.length>0){
							if(currentUserName){
								setArticleH(btnReadmore,3);
							}else{
								setArticleH(btnReadmore,1.2);
							}
						}
					})()
				</script>
				</article>