相关概念
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. 可以用户传输层安全协议. 主要概念包括:
- 加密:隐藏从第三方传输的数据。
- 认证:确保交换信息的各方是他们声称的身份。
- 完整性:验证数据是否未被伪造或篡改。
参考:
- https://www.cloudflare.com/learning/ssl/what-is-ssl/
- https://www.cloudflare.com/learning/ssl/transport-layer-security-tls/
CA & 证书
CA
(Certificate Authority) 是证书颁发机构, 授信的第三方组织.
证书, 是由 CA 生成并颁发 (使用机构自己的私钥进行签名, 以便客户端进行验证) 的数字签名文件, 用于加密互联网数据, 验证服务器身份.
自签名证书, 并非来自 CA 签名的证书.
私钥/密钥 & 公钥 & 证书 & CA
私钥/密钥
和 公钥
的概念来源于 RSA 非对称加密 的原理. 我们在另一篇文章中讲.
A 根据 RSA 算法生成 私钥
, 公钥
, 然后将 公钥
交给其他人 B 用于之间的加密通信.
b 是窃取数据, 网络数据欺骗的黑客, 由于 A 的公钥是公开的, b 也可以获取 A 的正确公钥.
1 | // A收消息过程(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
参考:
- https://blog.csdn.net/jeesr/article/details/87969706
- https://ztabox.com/knowledgebase_article.php?id=76
X.509 和 PKCS
X.509
公钥证书格式标准, 在 RFC5280
的 X.509 v3
中定义, TLS 格式证书即采用此标准.
PKCS
(Public-Key Cryptography Standards) 公钥加密标准, 将 X.509
证书的公钥进行加密的方案, PKCS 目前共发布过 15 个标准, 常用的为 PKCS#7
PKCS#10
和 PKCS#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 | # 生成 PEM 密钥 |
DER(Distinguished Encoding Rules)
打开看是二进制格式。
Java
和 Windows
服务器偏向于使用这种编码格式.
查看 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 格式的数据.
- .CRT(Certificate) 证书, PEM/DER 格式之一, 常见 Unix 中大多为 PEM.
参考 PEM, DER 格式.
- .CER(Certificate) 证书, PEM/DER 格式之一, 常见 Windows 中大多为 DER.
参考 PEM, DER 格式.
- .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
- .KEY 公钥/私钥, 不是证书. PEM/DER 格式.
查看 Key 信息:
PEM: openssl rsa -in <pk.key> -text -noout
DER: openssl rsa -in <pk.key> -text -noout -inform der
- .CSR(Certificate Signing Request) 证书签名请求文件, 不是证书, PEM/DER 格式, 内容是公钥+所有者信息, 申请时会生成私钥.
请求签发:
PEM: openssl req -noout -text -in <myreq>.csr
DER: openssl req -noout -text -in <myreq>.csr -inform der
.P7B/.P7C PKCS#7 证书+信任链证书(中间 CA). 常见 Java, Tomcat.
.JKS(Java Key Store) 私钥+证书, 有密码保护, Java 的 keytool 进行格式转换, 常见 Tomcat.
参考:
- HTTPS 证书相关概念
- SSL 证书格式普及, PEM、CER、JKS、PKCS12 或 https://blog.freessl.cn/ssl-cert-format-introduce/
- 证书之间的转换, CRT、PEM、KEY)
- OpenSSL:证书格式的相互转换, 例如.pem,.crt,.cer,.pfx
- http://www.360doc.com/content/15/0520/10/21412_471902987.shtml
- https://zhuanlan.zhihu.com/p/30655259
- https://www.zhihu.com/question/29620953
- https://blog.csdn.net/qq_30698633/article/details/77895151
- https://blog.csdn.net/qq_37049781/article/details/84837342
- http://www.360doc.com/content/15/0520/10/21412_471902987.shtml
- https://www.barretlee.com/blog/2015/10/05/how-to-build-a-https-server/
- https://blog.csdn.net/qq827245563/article/details/84305713
- https://blog.miniasp.com/post/2019/02/25/Creating-Self-signed-Certificate-using-OpenSSL
证书在线转换格式
总结
万恶之源为 SSL/TLS
, 加密通信主要使用 公钥
私钥/密钥
实现, 为了保证 公钥
的合法性, CA
机构基于 X.509
标准对 公钥
进行认证, 颁发 证书
. 证书有 PEM
和 DER
两种编码格式, 具体到 Windows, Linux, Java 等使用的是不同的实现方案, 所以有五彩斑斓的扩展名.