Https 证书相关概念以及使用细节

相关概念

SSL/TLS CA 证书 私钥 公钥 CA bundle keystore truststore

X.509 v3 PKCS#1 - PKCS#15

PEM DER

CRT CER KEY CSR PFX/P12 P7B/P7C JKS

概念分类

SSL/TLS

SSL(Secure Sockets Layer), 加密的互联网安全协议. TLS(Transport Layer Security), 传输层安全性.
SSL 是当今使用的现代 TLS 加密的前身.

现在使用的均为 TLS. 可以用户传输层安全协议. 主要概念包括:

  1. 加密:隐藏从第三方传输的数据。
  2. 认证:确保交换信息的各方是他们声称的身份。
  3. 完整性:验证数据是否未被伪造或篡改。

参考:

CA & 证书

CA(Certificate Authority) 是证书颁发机构, 授信的第三方组织.

证书, 是由 CA 生成并颁发 (使用机构自己的私钥进行签名, 以便客户端进行验证) 的数字签名文件, 用于加密互联网数据, 验证服务器身份.

自签名证书, 并非来自 CA 签名的证书.

私钥/密钥 & 公钥 & 证书 & CA

私钥/密钥公钥 的概念来源于 RSA 非对称加密 的原理. 我们在另一篇文章中讲.

A 根据 RSA 算法生成 私钥, 公钥, 然后将 公钥 交给其他人 B 用于之间的加密通信.

b 是窃取数据, 网络数据欺骗的黑客, 由于 A 的公钥是公开的, b 也可以获取 A 的正确公钥.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// A收消息过程(B 把消息发给 A)
B 消息 --> [公钥] --> 加密后的信息 --> [私钥] --> A 正确消息

// A回消息(B 收取 A的消息)
A 消息 --> [Hash] --> 摘要(Digest) --> [私钥] --> 签名(Signature)
A 消息+签名(Signature) --> [网络] --> B 消息+签名(Signature)

B 签名(Signature) --> [公钥] --> 解密的摘要(Digest)
B 消息 --> [Hash] --> 生成的摘要(Digest)
B 对比 解密的摘要 和 生成的摘要 是否一致, 判断消息是否是伪造的或者篡改过.

// 消息的窃取
消息-->[公钥]-->加密后的信息-->[b窃取]-->乱码
==> 因为窃取者 b 没有 A 的密钥无法解密.

// 消息的篡改欺骗
A 消息 --> Hash --> 摘要(Digest) --> [b私钥] --> b签名
B 拿到消息和 b签名, 使用 A 的公钥进行了校验, 无法验证一致性.

至此, 一切都那么美好, 直到 b 灵机一动, 将 B 持有的 A 给 B 的公钥, 替换成了 b 私钥对应的公钥(伪装成 A 公钥的假公钥). 这时 B 向 A 发消息, A 无法解密, 但是 b 可以成功窃取到信息. 同时 b 可以伪造消息, 假借 A 身份发给 B, B 用被 b 替换的假公钥解密成功, 信以为真, 造成了消息的欺骗. 换句话说, B 无法确认自己手里的公钥真的是 A 发出的.

这时候, 第三方认证机构 CA 出来认证, A 的个人信息 + A 的公钥 --> [CA 密钥] --> 数字证书, 任何人拿着数字证书, 到 CA 来查询, CA 经过自己的 CA 私钥 进行认证, 就可以证明这个证书是否真正是由 A 所有. 之后, 拿着证书的人, 就可以放心的使用证书中的 公钥 来与 A 进行通信了.

强烈推荐阅读此参考文档:

CA Bundle

有时候, 有些地方在配置证书的时候, 要求的是 CA Bundle, 那么 CA Bundle 是什么呢?

总的来说, 就是光有证书不行, 你还要证明自己是合法的, 那么怎么证明呢, 就是要有证书签发的证据链.

证书的证据链就是认证过程, 是顶级机构认证几家代理机构, 代理机构向用户发行证书, 或者再认证子代理机构, 总之就是根据你的证书, 找到发行机构, 找到发行机构证书的发行机构直到顶级证书为止.

证书本身 + 证明自己身份可信的证据链 => CA Bundle

参考:

X.509 和 PKCS

X.509 公钥证书格式标准, 在 RFC5280X.509 v3 中定义, TLS 格式证书即采用此标准.

PKCS(Public-Key Cryptography Standards) 公钥加密标准, 将 X.509 证书的公钥进行加密的方案, PKCS 目前共发布过 15 个标准, 常用的为 PKCS#7 PKCS#10PKCS#12.

参考:

PEM DER

X.509 的两种编码格式

PEM (Privacy Enhanced Mail)

打开看是文本格式, 以”—–BEGIN…”开头, “—–END…”结尾, 内容是 BASE64 编码.

Apache*NIX 服务器偏向于使用这种编码格式.

查看 PEM 格式证书的信息: openssl x509 -in certificate.pem -text -noout

转换为 DER 格式: openssl x509 -in certificate.pem -outform der -out certificate.der

生成 PEM 自签名证书:

1
2
3
4
# 生成 PEM 密钥
openssl genrsa -des3 -out mykey.key 1024
# 生成 PEM 证书
openssl req -new -x509 -days 365 -key mykey.key -out myca.crt -config openssl.cnf

DER(Distinguished Encoding Rules)

打开看是二进制格式。

JavaWindows 服务器偏向于使用这种编码格式.

查看 DER 格式证书的信息: openssl x509 -in certificate.der -text -noout -inform der

转换为 PEM 格式: openssl x509 -in certificate.der -outform pem -out certificate.pem -inform der

CRT CER KEY CSR PFX/P12 P7B/P7C JKS

这些是文件的扩展名, 存储着 PEM 和 DER 格式的数据.

  1. .CRT(Certificate) 证书, PEM/DER 格式之一, 常见 Unix 中大多为 PEM.

参考 PEM, DER 格式.

  1. .CER(Certificate) 证书, PEM/DER 格式之一, 常见 Windows 中大多为 DER.

参考 PEM, DER 格式.

  1. .PFX/.P12 PKCS#12 私钥+证书, 有密码保护, 为 DER 编码. 常见 Windows IIS 和 IOS App 中.

查看 PFX 格式证书的信息: openssl pkcs12 -in certificate.pfx

PFX 转 PEM 格式: openssl pkcs12 -in <mycrt>.pfx -out <mycrt.pem> -nodes
PEM 转 PFX 格式: openssl pkcs12 -export -in <mycrt>.crt -inkey <pk>.key -out <mycrt>.pfx

  1. .KEY 公钥/私钥, 不是证书. PEM/DER 格式.

查看 Key 信息:

PEM: openssl rsa -in <pk.key> -text -noout
DER: openssl rsa -in <pk.key> -text -noout -inform der

  1. .CSR(Certificate Signing Request) 证书签名请求文件, 不是证书, PEM/DER 格式, 内容是公钥+所有者信息, 申请时会生成私钥.

请求签发:

PEM: openssl req -noout -text -in <myreq>.csr
DER: openssl req -noout -text -in <myreq>.csr -inform der

  1. .P7B/.P7C PKCS#7 证书+信任链证书(中间 CA). 常见 Java, Tomcat.

  2. .JKS(Java Key Store) 私钥+证书, 有密码保护, Java 的 keytool 进行格式转换, 常见 Tomcat.

参考:

证书在线转换格式

在线生成公钥私钥对

SSL 证书格式转换工具

证书格式转换

总结

万恶之源为 SSL/TLS, 加密通信主要使用 公钥 私钥/密钥 实现, 为了保证 公钥 的合法性, CA 机构基于 X.509 标准对 公钥 进行认证, 颁发 证书. 证书有 PEMDER 两种编码格式, 具体到 Windows, Linux, Java 等使用的是不同的实现方案, 所以有五彩斑斓的扩展名.

Donate - Support to make this site better.
捐助 - 支持我让我做得更好.