# SSL 证书和公私钥的关系

先说结论:SSL 证书是公私钥密码中的一种应用,属于公钥认证。

# SSL 证书是上面?

在互联网信道上传输数据,我们需要考虑三个问题:①信息监听窃取②信息篡改③身份伪造
为了解决信息监听窃取这个问题,我们使用非对称加密对我们的信息进行加密,这样只有目标能够解密获取明文,整个链路上的窃听者都无法获取到明文,可以称之为公钥加密。
而信息篡改这个问题,也很好解决,使用数字签名 hash 算法对我们的明文进行一个 hash,然后将 hash 跟着明文一起加密后发送过去就可以了。

那么身份伪造怎么解决呢?显然这个身份证明不能由当事人自己发出来,因此必须引入可信第三方(CA)来做证,由第三方来为大家证明身份。SSL 证书也正是 CA 颁发给网站的 "身份证", 由于它的生成用到了非对称密钥密钥,因此可以称之为公钥认证。

# SSL 证书的生成

当服务方向 CA 提供公钥、组织信息、颁发者等请求认证申请后。
・首先 CA 会把持有者的公钥、用途、颁发者、有效时间等信息打成一个包,然后对这些信 息进行 Hash 计算,得到一个 Hash 值;
・然后 CA 会使用自己的私钥将该 Hash 值加密,生成 Certificate Signature,也就是 CA 对证书做了签名;
最后将 Certificate Signature 添加在文件证书上,形成数字证书;

# 客户端怎么校验 SSL 证书的合法性

SSL 证书是怎么进行身份认证的?我们前面提及了 SSL 的生成方式,从这个生成我们不难看出,目标证书被 CA 的私钥进行了前面,那么我们只需要对 CA 前面后的明文进行解密,看看内容是否一致就可以确定这个证书是否合法了。

• 首先客户端会使用同样的 Hash 算法获取该证书的 Hash 值 H1;
• 通常浏览器和操作系统中集成了 CA 的公钥信息(浏览器预存的一些CA的公钥)
• 如果CA不被信任,或者找不到对应CA的证书,那么就判断证书非法。

# 小结

SSL 证书 = 服务端公钥 + 申请者与颁发者信息 + 签名(由 CA 的私钥进行的签名)
通常 SSL 证书都是和域名绑定的,因此我们就算得到了证书也无法冒充目标网站,除非你连域名都得到了。

# SSL 证书的格式

# 证书的常用格式

一般来说,主流的 Web 服务软件,通常都基于 OpenSSL 和 Java 两种基础密码库。

根据不同的密码库,不同的 web 服务器,支持和使用的证书格式也各不相同。

  • Tomcat、Weblogic、JBoss 等 Web 服务软件,一般使用 Java 提供的密码库。通过 Java Development Kit (JDK)工具包中的 Keytool 工具,生成 Java Keystore(JKS)格式的证书文件。
  • Apache、Nginx 等 Web 服务软件,一般使用 OpenSSL 工具提供的密码库,生成 PEM、KEY、CRT 等格式的证书文件。
  • IBM 的 Web 服务产品,如 Websphere、IBM Http Server(IHS)等,一般使用 IBM 产品自带的 iKeyman 工具,生成 KDB 格式的证书文件。
  • 微软 Windows Server 中的 Internet Information Services(IIS)服务,使用 Windows 自带的证书库生成 PFX 格式的证书文件。

# 各种格式的证书含义

• *.DER或*.CER文件: 这样的证书文件是二进制格式,属于公钥,只含有证书信息,不包含私钥,。
• *.CRT文件: 这样的证书文件可以是二进制格式,也可以是文本格式,一般均为文本格式,功能与 *.DER及*.CER证书文件相同。
• *.PEM文件: 这样的证书文件一般是文本格式,可以存放证书或私钥,或者两者都包含。 *.PEM 文件如果只包含私钥,一般用*.KEY文件代替。
• *.PFX或*.P12文件: 这样的证书文件是二进制格式,同时包含证书和私钥,且一般有密码保护。

# 证书识别

对于二进制的证书可能不好分辨,但是文本格式的证书我们完全可以直接打开证书文件。如果显示的是规则的数字字母,例如:
—–BEGINCERTIFICATE—–
MIIE5zCCA8+gAwIBAgIQN+whYc2BgzAogau0dc3PtzANBgkqh......
—–ENDCERTIFICATE—–

  • 如果存在 ——BEGIN CERTIFICATE——,则说明这是一个证书文件。
  • 如果存在 —–BEGIN RSA PRIVATE KEY—–,则说明这是一个私钥文件。
  • 如果存在 ——BEGIN PUBLIC KEY——,则说明这是一个公钥文件。

# 证书格式转换

image-20220401135233907

# JKS 格式与 PFX 互转

可以使用 JDK 中自带的 Keytool 工具,将 JKS 格式证书文件转换成 PFX 格式。

keytool -v -importkeystore -srckeystore mykeystore.jks -srcstoretype jks -destkeystore mykeystore.pfx -deststoretype pkcs12  #将 jks 密钥库转成 pkcs12 类型

image-20220401135432408

keytool -v -importkeystore -srckeystore mykeystore.pfx -srcstoretype pkcs12 -destkeystore mykeystore.jks -deststoretype jks#将 jks 密钥库转成 pkcs12 类型

image-20220401135435959

# 将 PEM/KEY/CRT 格式证书转换为 PFX 格式

使用 OpenSSL 工具,将 KEY 格式密钥文件和 CRT 格式公钥文件转换成 PFX 格式证书文件。

openssl pkcs12 -export-outserver.pfx -inkey server.key -inserver.crt

# 将 PFX 转换为 PEM/KEY/CRT

openssl pkcs12 -in server.pfx -nodes -out server.pem
openssl rsa -in server.pem -out server.key
openssl x509 -in server.pem -out server.crt
openssl x509 -inform der -in key.crt -out cer.pem