在
文章中最后提到使用keytool.exe的自签证书实现双向认证可以,但是使用ejbca生成证书实现SLL Socket的双向认证是服务端老是报错提示 null cert chain的错误。
当时花了一整天的时间研究都没有眉目,今天突然想到,cert chain,证书链,查看客户端或服务证书库中的证书,含有除了自身的私匙外还有一个CA的公匙,如下图所示:
终于明白了,原来要实现双向认证,使用keytool.exe工具的-export命令除需要导出自身的公匙证书外,还需要导出含CA公匙的证书。整个步骤也就如下:
1.使用EJBCA系统创建客户端实体,token为jks证书库形式(主题DN信息参考其他文章),在create key store菜单中输入用户名密码导出客户端证书库 ejbcaclient.jks;
2.使用EJBCA系统创建服务端实体,token为jks证书库形式,在create key store菜单中输入用户名密码导出服务端证书库 ejbcaserver.jks;
3.使用keytool.exe工具的-export命令分别导出含有客户端公匙的证书以及含有CA签发机构公匙的证书 sslclient.crt,sslclientca.crt;
4.使用keytool.exe工具的-export命令分别导出含有服务端公匙的证书以及含有CA签发机构公匙的证书 sslserver.crt,sslserverca.crt;
5.将客户端证书和颁发客户端证书的CA证书使用keytool.exe的-import命令导入至服务端证书库 ejbcaserver.jks,使服务端在通信时信任客户端,确认客户端的身份;
6.将服务端证书和颁发服务端证书的CA证书使用keytool.exe的-import命令导入至客户端证书库 ejbcaclient.jks,使客户端在通信时信任服务端,并确认服务端的身份;
7.代码编写SLLSocket通信demo测试双向认证。
注意:
1.如果使用EJBCA系统在颁发客户端和服务端证书的签发机构为同一个机构,则在导入通信双方证书时不需要导入含签发机构CA公匙的证书,因为证书库里面已经包含了此证书。
下面附上SSLSocket双向认证通信的简易测试代码。此代码中含 将服务端证书及CA证书自动导入到客户端证书库的功能。