证书加密(二):自建CA,证书加密,双向SSL分析

证书加密(二):自建CA,证书加密,双向SSL分析

证书加密(二):自建CA,证书加密,双向SSL分析

双向SSL的流程如上,综合来看,上面用到了CA根证书,client.key(客户端私钥),client.cer(客户端证书,包含公钥),server.key(服务端私钥),server.cer(服务端证书,包含公钥)。

CA根证书从何而来?

如果是权威CA机构的话,CA根证书通常是预置在浏览器或操作系统中了。如果是自建CA,利用openssl工具先生成CA私钥,再由该私钥生成CA数字证书,client.key和server.key也是先由openssl生成的私钥,然后再根据client.key和server.key生成签发请求csr,再使用CA私钥对csr签发client.cer和server.cer,所以安装信任了CA证书,可以用CA证书里的公钥去确定这个client.cer或server.cer是不是CA机构签发的,如果是CA机构签发的说明*.cer是值得信任的,那么cer里的公钥就是正确的,这种关系又称为证书链。我们用openssl自建CA,然后将CA的数字证书提前发给用户让用户装到电脑上就可以了。

具体操作:自建CA

OpenSSL和keytool有什么区别?

在查阅资料时经常看到这两个工具,那么到底有什么区别?openssl有自建CA签发的功能,而keytool没有。keytool可以将证书导入生成keystore文件,keystore文件是java开发用的文件,可以理解为一个存储私钥、公钥、数字证书的数据库,通常我们开发java应用都不会直接使用证书文件,而是利用keytool工具导入到keystore文件中使用。上图中安装CA证书在java开发中是把CA证书导入到一个keystore中,然后在配置中将该keystore设置为信任库,在windows桌面使用时是把它双击一下,安装到windows的证书信任库中。这样子,由该CA签发的都是可信的了。私钥和端证书都存放在另一个keystore中,这一点在springboot配置ssl时可以看得出。所以java开发双向ssl时需要两个keystore。

KeyStore具体是什么?

KeyStore即**库,管理分为三种不同的项,不同的项保存的信息不一样。三个项是公钥,私钥和证书链的某种组合及不同的存储方式。

  • KeyStore.PrivateKeyEntry

    此类型的项保存一个加密的 PrivateKey,可以选择以受保护格式存储该私钥来防止未授权访问。它也随附一个相应公钥的证书链。

    给定项使用私钥和证书链进行自验证 (self-authentication)。应用此验证的包括软件发布组织,它们将 JAR 文件签名为发布和/或许可软件的一部分。

  • KeyStore.SecretKeyEntry

    此类型的项保存一个加密的 SecretKey,可以选择以受保护格式存储该**来防止未授权访问。

  • KeyStore.TrustedCertificateEntry

    此类型的项包含一个属于另一方的单个公钥 Certificate。它被称为可信证书,因为 keystore 的所有者相信证书中的公钥确实属于由该证书的 subject(所有者)所标识的身份。

keystore的类型有五种:**JKS, JCEKS, PKCS12, BKS,UBER。**注意这里是keystore类型而不是数字证书类型,数字证书是存储在keystore里的东西。数字证书有pem,cer,crt,pkcs12等等类型。这里pkcs12既可以是证书又可以是keystore,不能直接使用,需要通过工具转换。请参考证书导入keystore

已有privateKey和CA签名的服务端证书如何生成keystore?如何从keystore导出privatekey?

在使用springboot开发的时候,服务端的私钥和服务端证书是放在一个keystore中的,而受信任的客户端证书是放在另一个keystore中的。所以我们有必要将已有privateKey和CA签名的服务端证书如何生成一个keystore。

生成方法。同样,有时候我们需要在一些软件里上传privatekey,比如mqtt客户端软件的自签证书模式就要求我们上传client.cer(客户端证书),client.key(客户端私钥),自建的CA证书。从keystore中导出,请参考导出

双向证书加密的例子

银行使用双向SSL的案例,客户拿到U盾回家,U盾里有客户端私钥和客户端数字证书,这个客户端数字证书是银行信任的CA机构签发的。当用户访问银行服务器时,银行服务器请求客户端数字证书,然后用CA证书里的公钥去验签,验签通过才可以建立通信。所以,没有U盾,就无法通信了。