0: Certification Guide

那些证书相关 Keywords

  • SSL
  • .p12
  • .key
  • .pem
  • .csr
  • .crt

SSL

SSL - Secure Sockets Layer

现在应该叫 TLS,但由于习惯问题,我们还是叫 SSL 比较多。HTTP 协议默认情况下是不加密内容的,这样就很可能在内容传播的时候被别人监听到,对于安全性要求较高的场合,必须要加密,HTTPS 就是带加密的 HTTP 协议,而 HTTPS 的加密是基于 SSL 的。它执行的是一个比较下层的加密,也就是说,在加密前,你的服务器程序在干嘛,加密后也一样在干嘛,不用动,这个加密对用户和开发者来说都是透明的。

OpenSSL - Open Secure Sockets Layer

简单地说,OpenSSL 是 SSL 的一个实现,SSL 只是一种规范。理论上来说,SSL 这种规范是安全的,目前的技术水平很难破解,但 SSL 的实现就可能有些漏洞,如著名的 “心脏出血”。

OpenSSL 还提供了一大堆强大的工具软件,强大到 90% 我们都用不到。

1. 证书标准

X.509 -

这是一种证书标准,主要定义了证书中应该包含哪些内容,其详情可以参考 RFC5280,SSL 使用的就是这种证书标准。

2. 编码格式

同样的 X.509 证书,可能有不同的编码格式,目前有以下两种编码格式.

PEM - Privacy Enhanced Mail

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

查看PEM格式证书的信息:

1
openssl x509 -in certificate.pem -text -noout

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

DER - Distinguished Encoding Rules

打开看是二进制格式,不可读。

查看DER格式证书的信息:

1
openssl x509 -in certificate.der -inform der -text -noout

Java 和 Windows 服务器偏向于使用这种编码格式。

3. 相关的文件扩展名

这是比较误导人的地方,虽然我们已经知道有 PEM 和 DER 这两种编码格式,但文件扩展名并不一定就叫 “PEM” 或者 “DER”,常见的扩展名除了 PEM 和 DER 还有以下这些,它们除了编码格式可能不同之外,内容也有差别,但大多数都能相互转换编码格式。

CRT - Certificate 缩写

其实还是证书的意思,常见于 *NIX 系统,有可能是PEM编码,也有可能是DER编码,大多数应该是PEM编码,相信你已经知道怎么辨别。

CER - 还是 Certificate 缩写

还是证书,常见于 Windows 系统,同样的,可能是PEM编码,也可能是DER编码,大多数应该是DER编码。

KEY -

通常用来存放一个公钥或者私钥,并非 X.509 证书,编码同样的,可能是 PEM,也可能是 DER。

查看KEY的办法:

1
2
3
4
openssl rsa -in mykey.key -text -noout
# 如果是DER格式的话,同理应该这样了:
openssl rsa -in mykey.key -text -noout -inform der

CSR - Certificate Signing Request

即证书签名请求,这个并不是证书,而是向权威证书颁发机构获得签名证书的申请,其核心内容是一个公钥(当然还附带了一些别的信息),在生成这个申请的时候,同时也会生成一个私钥,私钥要自己保管好。做过 iOS APP 的朋友都应该知道是怎么向苹果申请开发者证书的吧。

查看的办法:

1
$ openssl req -noout -text -in my.csr (如果是DER格式的话照旧加上-inform der,这里不写了)
PFX/P12 - Predecessor of PKCS#12

对 *nix 服务器来说,一般 CRT 和 KEY 是分开存放在不同文件中的,但 Windows 的 IIS 则将它们存在一个 PFX 文件中,(因此这个文件包含了证书及私钥)这样会不会不安全?应该不会,PFX通常会有一个”提取密码”,你想把里面的东西读取出来的话,它就要求你提供提取密码,PFX使用的时DER编码,如何把PFX转换为PEM编码?

1
2
3
4
5
$ openssl pkcs12 -in for-iis.pfx -out for-iis.pem -nodes
# 这个时候会提示你输入提取代码. for-iis.pem就是可读的文本.
# 生成pfx的命令类似这样:
$ openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt

其中CACert.crt是CA(权威证书颁发机构)的根证书,有的话也通过-certfile参数一起带进去.这么看来,PFX其实是个证书密钥库。

REF::