iOS应该了解的HTTPS(二)—— 证书X.509

Author Avatar
xiaoLit Created: Feb 01, 2019 Updated: Nov 05, 2019

HTTPS中使用的证书X.509提到的数字证书其实包含很多东西,那么下面我们具体来看一下。

一、证书是什么

X.509ITU-T标准化部门基于他们之前的ASN.1定义的一套证书标准,是密码学里公钥证书的格式标准,己应用在包括TLS/SSL在内的众多 Intenet协议里。

X.509证书里含有公钥、身份信息(比如网络主机名,组织的名称或个体名称等)和签名信息(可以是证书签发机构CA的签名,也可以是自签名)。对于一份经由可信的证书签发机构签名或者可以通过其它方式验证的证书,证书的拥有者就可以用证书及相应的私钥来创建安全的通信,对文档进行数字签名

除了证书本身功能,X.509还附带了证书吊销列表和用于从最终对证书进行签名的证书签发机构直到最终可信点为止的证书合法性验证算法。

二、证书的来源-签名过程

X.509里,一个组织机构或公司是通过发起证书签名请求CSR来得到一份签名的证书。首先需要生成一对钥匙对,然后用其中的私钥对CSR进行签名,并安全地保存私钥。CSR进而包含有请求发起者的身份信息、用来对此请求进行验真的的公钥以及所请求证书专有名称。

CSR里还可能带有CA要求的其它有关身份证明的信息。然后CA对这个专有名称发布一份证书,并绑定一个公钥。组织机构可以把受信的根证书分发给所有的成员,也就是类似各大浏览器和系统都预装有早就确定的根证书列表,所以使用主流CA发布的证书SSL/TLS才可以直接正常使用。

可以看到数字证书的生成是分层级的,下一级的证书需要其上一级证书的私钥签名。
所以后者是前者的证书颁发者,也就是说上一级证书的Subject Name是其下一级证书的Issuer Name

那么CA的根证书是什么呢?
其实CA根证书是自签名的,即用自己的私钥签名,不需要其他证书的私钥来生成签名。

三、证书格式

X.509有多种常用的扩展名。不过其中的一些还用于其它用途,就是说具有这个扩展名的文件可能并不是证书,比如说可能只是保存了私钥。

我们必须要了解的第一件事是每种类型的文件扩展名是什么。有关DERPEMCRTCER的内容存在很多困惑,许多人错误地说它们都是可以互相转换的。虽然在某些情况下可以,但最佳做法是确定证书的编码格式,然后正确区分不同格式的证书将更容易操作。

1. 编码格式

  • .DER - Privacy Enhanced Mail
    .DER = DER扩展用于二进制DER编码证书。打开看文本格式,以”—BEGIN…”开头, “—END…”结尾,内容是BASE64编码。这些文件也可能带有CERCRT扩展名。正确的说法是“我有DER编码证书”而不是“我有DER证书”。

  • .PEM - Distinguished Encoding Rules
    .PEM = PEM扩展用于不同类型的X.509v3文件,是以“ - BEGIN …”前缀的ASCIIBase64)数据。是二进制格式,不可读。

查看DER格式证书的信息:

openssl x509 -in certificate.der/cer/crt -inform der -text -noout

查看PEM编码证书:

openssl x509 -in certificate.pem/cer/crt -text –noout

2. 相关的文件扩展名

  • .CRT = CRT扩展用于证书。 证书可以被编码为二进制DERASCII PEMCERCRT扩展几乎是同义词。 最常见的于Unix 或类Unix系统(DER编码的.crt,或base64`PEM编码的.crt`,这两种都有)。

  • .CER =.CRT的替代形式(Microsoft Convention)可以在微软系统环境下将.crt转换为.cer(两种编码格式都有)。

  • .KEY= KEY扩展用于公共和私有PKCS #8。密钥同样有两种编码格式。查看KEY的办法:openssl rsa -in mykey.key -text -noout。如果是DER格式的话,同理应该这样了:openssl rsa -in mykey.key -text -noout -inform der

  • PFX/P12 - PKCS#12(个人消息交换标准-Personal Information Exchange Syntax Standard)格式,包含证书的同时可能还有带密码保护的私钥。PKCS #12 是微软 PFX 文件的替代者,然而,PKCS #12文件和PFX文件这两个词有时被相互替代使用用。

CRTCER可以安全地互换的唯一情况是编码类型可以相同。(即PEM编码CRT = PEM编码CER

3. 转换证书编码格式

PEM到DER:

openssl x509 -in cert.crt -outform der-out cert.der

DER到PEM:

openssl x509 -in cert.crt -inform der -outform pem -out cert.pem

(提示:要转换KEY文件也类似,只不过把上面的x509换成rsa,要转CSR的话,把x509换成req…)

4. 组合证书

在某些情况下,将多个X.509基础设施组合到单个文件中是有利的。一个常见的例子是将私钥和公钥两者结合到相同的证书中。组合密钥和链的最简单的方法是将每个文件转换为PEM编码的证书,然后将每个文件的内容简单地复制到一个新文件中。这适用于组合文件以在Apache中使用的应用程序。

四、获得证书

1. 向权威证书颁发机构申请证书

用这命令生成一个csr:

openssl req -newkey rsa:2048 -new -nodes -keyout my.key -out my.csr

-req  表明输入文件是一个"请求签发证书文件(CSR)",等待进行签发 
-newkey rsa:bits  生成一个bits长度的RSA私钥文件,用于签发 
-new  新的请求
-nodes  生成的私有密钥文件将不会被加密
-keyout file  指定生成的私钥文件名称
-out file  处理结束后输出的证书文件

csr交给权威证书颁发机构,权威证书颁发机构对此进行签名,完成.保留好csr,当权威证书颁发机构颁发的证书过期的时候,你还可以用同样的csr来申请新的证书,key保持不变。

2. 或者生成自签名的证书

openssl req -newkey rsa:2048 -new -nodes -x509 -days 365 -keyout key.pem -out cert.pem

-x509  签发X.509格式证书命令
-days 365  表示有效天数,这里为365天

在生成证书的过程中会要你填一堆的东西,其实真正要填的只有Common Name,通常填写你服务器的域名,如"yourcompany.com",或者你服务器的IP地址,其它都可以留空的。

3. 获取到站点的证书

如果是服务器已经配置了证书,直接找后台要公钥证书就好。如果暂时拿不到其实也可以我们自己动手。以google为例。

openssl s_client -connect www.google.com:443 </dev/null 2>/dev/null | openssl x509 -outform DER > https.cer

该条命令将会在当前路径下,形成google.com站点的公开二进制证书,命名为https.cer。就可以愉快的玩耍了。

注: -nodes 生成的私有密钥文件将不会被加密。也就是在每次Apache启动Web服务器时,都会要求输入密码,如果忘记了加上可以后期删除私钥中的密码,操作如下:

cp server.key server.key.org
openssl rsa -in server.key.org -out server.key

五、HTTPS中的验证

证书校验就是递归地从叶节点证书到根证书验证。需要验证证书本身的合法性(验证签名完整性,验证证书有效期等)。

验证证书颁发者的合法性(查找颁发者的证书并检查其合法性,这个过程是递归的)。而递归的终止条件是证书验证过程中遇到了锚点证书(锚点证书:通常是嵌入到操作系统中的根证书,这个根证书是权威证书颁发机构颁发的自签名证书。)(当然我们也能自定义)。

当客户端走HTTPS访问站点时,服务器会返回整个证书链。以下图百度的证书链为例:

要验证 baidu.com 这个证书有没被篡改,就要用到GlobalSign Organization Validation CA - SHA256 - G2 提供的公钥解密前者的签名得到摘要 Digest1,我们的客户端也计算前者证书的内容得到摘要 Digest2。对比这两个摘要就能知道前者是否被篡改。后者同理,使用 GlobalSign Root CA 提供的公钥验证。当验证到到受信任的根证书时,就能确定 baidu.com 这个证书是可信的。

注意:

1.那么又是如何确定上面提到的根证书GlobalSign Root CA是受信任的呢?

上面’证书的来源-签名过程’-我们不仅提到过,CA根证书是自签名的,即用自己的私钥签名,签署和管理的CA根证书的同时会将证书纳入到各种浏览器和操作系统的可信证书列表中,并由这个列表判断根证书是否可信。所以不要随便导入其他的根证书到你的操作系统中。

2.那么这么说如果我们有这么个证书,也能使用类似CA的功能给其他人的CSR进行签名?

不一定。如下图,拓展字段里面有个叫基本约束的数据结构,里面有个字段叫路径长度限制(Path Length Constraint),表明了该证书能继续签署 CA 子证书的深度,这里为0,说明这个 GlobalSign Organization Validation CA - SHA256 - G2 只能签署客户端证书,而客户端证书不能用于签署新的证书,CA子证书才能这么做。

Reference

DER vs. CRT vs. CER vs. PEM Certificates and How To Convert Them

那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)

OpenSSL命令使用指南

OpenSSL命令详解