尽管在TLS 1.3 中,证书是可选的(可以直接使用纯 Key),但是大多数应用和协议(不仅仅是 Web)都大量使用了证书来验证一些其它元数据。具体来说,就是 X.509 证书标准的第 3 个版本。
X.509 标准使用了一个叫做 ASN.1(Abstract Syntax Notation One) 的描述语言,用它来指定包含在证书中的信息。
ASN.1 的格式大约是这样:
tbsCertificate。“to-be-signed”certificate,也就是要被签名的证书。这里面包含了所有想要验证的信息。对于 Web 来说,这里可以包含一个域名(www.bing.com),一个 public key,一个过期日期等等。
signatureAlgorithm。用来对证书签名的算法。
signatureValue。来自 CA 的签名。
通过浏览器连接到一个使用了 HTTPS 的网站,你就可以很简单的就查看一个 X.509 证书里面的内容:
PEM 文件
你可能会经常看到 .pem 后缀的 X.509 证书,里面的内容是使用 base64 进行编码的,开头和结尾是有“注释”的:
如果你对里面base64 部分的内容进行解码,你就会得到 DER(Distinguished Encoding Rules,可辩别编码规则) 编码的证书。DER 是一种确定性的(只有一种编码方式)二进制编码,它可以把 X.509 证书翻译成字节。
它们之间的关系转化如图:
尽管说了这么多,但是 X.509 证书还是颇具争议的。
2012年,一组研究人员将验证X.509证书戏称为“世界上最危险的代码”。这是因为DER编码是一种难以正确解析的协议,而X.509证书的复杂性使得许多错误具有潜在的破坏性。因此,不建议任何现代应用程序使用X.509证书,除非必须使用它们。