前情提要
PKI
简介
回顾下上一节关于非对称加密知识,通过对称加密、密钥协商以及数字签名的手段使得通信更加安全。但这其中有一个非常关键的问题,就是单纯依赖非对称加密是无法防止中间人攻击,通俗点,就是如何证明“你是你”的问题:举个例子,如何确保我请求的百度网站的确就是真正网站,而不是中间人劫持伪造的。
证明身份的必须依赖一个权威的第三方机构或组织,参考下我国的居民身份证,身份证就是我们个人身份的证明文件,国家机关就是是权威机构,它为我们的个人身份背书。
在互联网上,也有一套这样的体系来管理网站或服务器身份,它就是PKI,全称为Public Key Infrastructure(公钥基础设施) ,PKI是由一系列的软件、硬件、组织、个体、法律、流程组成的集合体,主要的目的就是向客户端提供服务端的身份认证(反之也可,在HTTPS中主要是前者)。
身份认证的基础就是必须找到一个可信的第三方组织,由它提供身份审核、身份颁发和身份验证的手段,这里颁发的“身份证”就是数字证书,其认证的技术方案就是数字签名技术。第三方组织能够使用数字签名技术管理证书,包括创建证书、存储证书、更新证书、撤销证书。
组成
根据PKI X.509标准,PKI组成如下:
- 服务器实体:即需要申请证书的实体,可以是一个网站,也可以是一台服务器
- CA机构:证书签发的权威机构,负责审核申请者的身份并颁发证书,必要时可以更新或者吊销证书
- 证书仓库:用于存放证书以及被吊销证书列表
- OCSP服务:提供校验证书是否被吊销的服务
X.509
为了规范化运用PKI技术,出现了很多标准,HTTPS中最常用的标准就是X.509标准,证书是PKI最核心、最重要的内容,提到证书也可以认为是X.509标准证书。x.509证书包含持有者的身份信息、公钥和签名信息(CA签名或者自签名),另外x.509还附带证书吊销列表和基于证书信任链的合法性验证算法
下面依次介绍X.509标准中关于证书、证书链、证书吊销内容。
证书
证书结构
证书在PKI体系中相当于现实中的“居民身份证”,用来标识拥有这个证书的服务器实体的身份,主要包含了以下部分内容:
一部分是身份信息,即“是谁”内容;一部分就是自身的公开密钥(服务器实体保留私钥,且不可泄露);一部分就是证书签名,主要是防止伪造证书;剩余部分就包含签发者、证书有效期、签名算法、扩展信息等等
以www.baidu.com
网站证书为例,通过Chrome查看证书内容如下:
也可以使用导出功能导出证书到本地baidu.com.cer
,在本地使用openssl
命令行查看证书结构:
baidu.com.cer证书内容
-----BEGIN CERTIFICATE-----
MIIKEjCCCPqgAwIBAgIMRBfOhu+C7GkhzG9oMA0GCSqGSIb3DQEBCwUAMFAxCzAJ
BgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMSYwJAYDVQQDEx1H
bG9iYWxTaWduIFJTQSBPViBTU0wgQ0EgMjAxODAeFw0yMjA3MDUwNTE2MDJaFw0y
MzA4MDYwNTE2MDFaMIGnMQswCQYDVQQGEwJDTjEQMA4GA1UECBMHYmVpamluZzEQ
MA4GA1UEBxMHYmVpamluZzElMCMGA1UECxMcc2VydmljZSBvcGVyYXRpb24gZGVw
YXJ0bWVudDE5MDcGA1UEChMwQmVpamluZyBCYWlkdSBOZXRjb20gU2NpZW5jZSBU
ZWNobm9sb2d5IENvLiwgTHRkMRIwEAYDVQQDEwliYWlkdS5jb20wggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqL8xBjSWug+n0J8QAszlvDpgqVX0H5YBJ
gvrT04WYtd97b7sC3e145AwHK54ehkv2aoZY11dvIVkR2G+WbtLeNij2tOPOlTIp
AMFljmmwAP5SN/SIP4ttD7vw7MXAMe+ttQwGZq2+3EMTxGawXc9WU+LRloIcBrub
X+1gjdLt89JQ7rvNsjaXyM570ku3XLSIyjdui875lv209Ue1IHe7/KidgbJs+McJ
at0iboM/p1Pf8dovKWsiw+kdZejFoLoTThY/A5PwpVmKGoDoJ31JI9/R+UuXtwHE
GfXxxf+RM9ChdMbu1M/2OAztvV6qRPuI93uZcHY0VX5V0g+ev5STAgMBAAGjggaS
MIIGjjAOBgNVHQ8BAf8EBAMCBaAwgY4GCCsGAQUFBwEBBIGBMH8wRAYIKwYBBQUH
MAKGOGh0dHA6Ly9zZWN1cmUuZ2xvYmFsc2lnbi5jb20vY2FjZXJ0L2dzcnNhb3Zz
c2xjYTIwMTguY3J0MDcGCCsGAQUFBzABhitodHRwOi8vb2NzcC5nbG9iYWxzaWdu
LmNvbS9nc3JzYW92c3NsY2EyMDE4MFYGA1UdIARPME0wQQYJKwYBBAGgMgEUMDQw
MgYIKwYBBQUHAgEWJmh0dHBzOi8vd3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRv
cnkvMAgGBmeBDAECAjAJBgNVHRMEAjAAMD8GA1UdHwQ4MDYwNKAyoDCGLmh0dHA6
Ly9jcmwuZ2xvYmFsc2lnbi5jb20vZ3Nyc2FvdnNzbGNhMjAxOC5jcmwwggNhBgNV
HREEggNYMIIDVIIJYmFpZHUuY29tggxiYWlmdWJhby5jb22CDHd3dy5iYWlkdS5j
boIQd3d3LmJhaWR1LmNvbS5jboIPbWN0LnkubnVvbWkuY29tggthcG9sbG8uYXV0
b4IGZHd6LmNuggsqLmJhaWR1LmNvbYIOKi5iYWlmdWJhby5jb22CESouYmFpZHVz
dGF0aWMuY29tgg4qLmJkc3RhdGljLmNvbYILKi5iZGltZy5jb22CDCouaGFvMTIz
LmNvbYILKi5udW9taS5jb22CDSouY2h1YW5rZS5jb22CDSoudHJ1c3Rnby5jb22C
DyouYmNlLmJhaWR1LmNvbYIQKi5leXVuLmJhaWR1LmNvbYIPKi5tYXAuYmFpZHUu
Y29tgg8qLm1iZC5iYWlkdS5jb22CESouZmFueWkuYmFpZHUuY29tgg4qLmJhaWR1
YmNlLmNvbYIMKi5taXBjZG4uY29tghAqLm5ld3MuYmFpZHUuY29tgg4qLmJhaWR1
cGNzLmNvbYIMKi5haXBhZ2UuY29tggsqLmFpcGFnZS5jboINKi5iY2Vob3N0LmNv
bYIQKi5zYWZlLmJhaWR1LmNvbYIOKi5pbS5iYWlkdS5jb22CEiouYmFpZHVjb250
ZW50LmNvbYILKi5kbG5lbC5jb22CCyouZGxuZWwub3JnghIqLmR1ZXJvcy5iYWlk
dS5jb22CDiouc3UuYmFpZHUuY29tgggqLjkxLmNvbYISKi5oYW8xMjMuYmFpZHUu
Y29tgg0qLmFwb2xsby5hdXRvghIqLnh1ZXNodS5iYWlkdS5jb22CESouYmouYmFp
ZHViY2UuY29tghEqLmd6LmJhaWR1YmNlLmNvbYIOKi5zbWFydGFwcHMuY26CDSou
YmR0anJjdi5jb22CDCouaGFvMjIyLmNvbYIMKi5oYW9rYW4uY29tgg8qLnBhZS5i
YWlkdS5jb22CESoudmQuYmRzdGF0aWMuY29tghEqLmNsb3VkLmJhaWR1LmNvbYIS
Y2xpY2suaG0uYmFpZHUuY29tghBsb2cuaG0uYmFpZHUuY29tghBjbS5wb3MuYmFp
ZHUuY29tghB3bi5wb3MuYmFpZHUuY29tghR1cGRhdGUucGFuLmJhaWR1LmNvbTAd
BgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHwYDVR0jBBgwFoAU+O9/8s14
Z6jeb48kjYjxhwMCs+swHQYDVR0OBBYEFDtwLT3oGQUARxIC74EY00EI5RZSMIIB
gQYKKwYBBAHWeQIEAgSCAXEEggFtAWsAdwDoPtDaPvUGNTLnVyi8iWvJA9PL0RFr
7Otp4Xd9bQa9bgAAAYHMyXLxAAAEAwBIMEYCIQCAJkJ9PZHF14jjp5pQmOqVHgWc
KJQe/CzCYYtU1jRusgIhAIKcdmnRNSZFGV0wNG9kEneZq3NtcvkKFiiNc4OV9HXe
AHcAb1N2rDHwMRnYmQCkURX/dxUcEdkCwQApBo2yCJo32RMAAAGBzMlyzgAABAMA
SDBGAiEA5hWVNwpM5TgNnimQHL0PCjW/sMVCuDDcCjcIn8Q+yvoCIQDuUewoBK8z
iBT+9+oWB4PZNcn845lM6CmywA7DkbPzgQB3AFWB1MIWkDYBSuoLm1c8U/DA5Dh4
cCUIFy+jqh0HE9MMAAABgczJcvwAAAQDAEgwRgIhAJ8GGwADLa35t5AptPcYTl8G
w8Z/ApE7WLF/aa008TuvAiEAnn86opE4Rx90KXEWoY1UuuK3A3c0DMhNkLT7SWM+
uRIwDQYJKoZIhvcNAQELBQADggEBAGMhByNHBuuzfHds37xVErnxXmoEYBa+0AsY
nJQMqIIIJQ0m+93L/Iwn2Qz6SrYxtmfwJiwNlpY5ZT/Zoe7enBBNVOHI1qkOd9sA
4jfjP7ScMU+sdNMiElM20O8YBy2O0OaRsmxKXjlTFFhO0VAEyYN+DXsVlocR111K
F6yqn4TjqCSd1hd3JoyfensY2jkvd/crxyO4l2/D0XJMfvzGDcxzOBmB++fBeui5
HToF3DYEm/Hw4aZHoDBPVZBs2s+esnYSEaFctmGNFaRoZZpXL3puox/1tJJaPN9x
Cs1X1NAVNn661QMlJ0W0YM0uAsEPCudBb1hpIJ6tR1IatebljR0=
-----END CERTIFICATE-----
在证书输出结果中增加了各个字段的含义 帮助读者理解。在这里有几个关键点:
- Subject:表示证书签发对象身份
- Subject Alternative Name:SAN扩展,一般在HTTPS中会去验证其域名或者IP是否和实际请求的匹配
$ openssl x509 -in baidu.com.cer -text -noout
// 以下是证书内容
Certificate:
Data:
// TLS的版本号 3表示是TLS1.3版本
Version: 3 (0x2)
// 该证书的唯一标号
Serial Number:
44:17:ce:86:ef:82:ec:69:21:cc:6f:68
// 证书采用的签名算法 本证书为带有RSA加密的SHA-256
Signature Algorithm: sha256WithRSAEncryption
// 本证书签发者的身份
Issuer: C=BE, O=GlobalSign nv-sa, CN=GlobalSign RSA OV SSL CA 2018
// 本证书的有效时间
Validity
Not Before: Jul 5 05:16:02 2022 GMT
Not After : Aug 6 05:16:01 2023 GMT
// 本证书签发对象的身份
Subject: C=CN, ST=beijing, L=beijing, OU=service operation department, O=Beijing Baidu Netcom Science Technology Co., Ltd, CN=baidu.com
// 证书持有者的公钥信息
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
...
Exponent: 65537 (0x10001)
// x.509标准v3版本支持的扩展
X509v3 extensions:
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
// CA机构信息
Authority Information Access:
CA Issuers - URI:http://secure.globalsign.com/cacert/gsrsaovsslca2018.crt
OCSP - URI:http://ocsp.globalsign.com/gsrsaovsslca2018
X509v3 Certificate Policies:
Policy: 1.3.6.1.4.1.4146.1.20
CPS: https://www.globalsign.com/repository/
Policy: 2.23.140.1.2.2
// 基础约束 表示该证书不能签发下级证书 如果证书是CA证书这里的值会是TRUE
X509v3 Basic Constraints:
CA:FALSE
// CRL文件
X509v3 CRL Distribution Points:
Full Name:
URI:http://crl.globalsign.com/gsrsaovsslca2018.crl
// 非常关键的SAN扩展 一般是域名或者泛域名
X509v3 Subject Alternative Name:
DNS:baidu.com, DNS:baifubao.com, DNS:www.baidu.cn, DNS:www.baidu.com.cn, DNS:mct.y.nuomi.com, DNS:apollo.auto, DNS:dwz.cn, DNS:*.baidu.com, DNS:*.baifubao.com, DNS:*.baidustatic.com, DNS:*.bdstatic.com, DNS:*.bdimg.com, DNS:*.hao123.com, DNS:*.nuomi.com, DNS:*.chuanke.com, DNS:*.trustgo.com, DNS:*.bce.baidu.com, DNS:*.eyun.baidu.com, DNS:*.map.baidu.com, DNS:*.mbd.baidu.com, DNS:*.fanyi.baidu.com, DNS:*.baidubce.com, DNS:*.mipcdn.com, DNS:*.news.baidu.com, DNS:*.baidupcs.com, DNS:*.aipage.com, DNS:*.aipage.cn, DNS:*.bcehost.com, DNS:*.safe.baidu.com, DNS:*.im.baidu.com, DNS:*.baiducontent.com, DNS:*.dlnel.com, DNS:*.dlnel.org, DNS:*.dueros.baidu.com, DNS:*.su.baidu.com, DNS:*.91.com, DNS:*.hao123.baidu.com, DNS:*.apollo.auto, DNS:*.xueshu.baidu.com, DNS:*.bj.baidubce.com, DNS:*.gz.baidubce.com, DNS:*.smartapps.cn, DNS:*.bdtjrcv.com, DNS:*.hao222.com, DNS:*.haokan.com, DNS:*.pae.baidu.com, DNS:*.vd.bdstatic.com, DNS:*.cloud.baidu.com, DNS:click.hm.baidu.com, DNS:log.hm.baidu.com, DNS:cm.pos.baidu.com, DNS:wn.pos.baidu.com, DNS:update.pan.baidu.com
X509v3 Extended Key Usage:
TLS Web Server Authentication, TLS Web Client Authentication
X509v3 Authority Key Identifier:
keyid:F8:EF:7F:F2:CD:78:67:A8:DE:6F:8F:24:8D:88:F1:87:03:02:B3:EB
X509v3 Subject Key Identifier:
...
// 证书签名算法以及签名值
Signature Algorithm: sha256WithRSAEncryption
...
证书验证
证书验证就是验证证书的内容和签名值是否匹配,证书中的签名采用的就是数字签名技术作为防篡改和抵赖手段。回顾下数字签名技术,采用私钥给信息加密,然后利用公钥计算摘要。在证书体系中:
- 证书签名验证主要是利用证书颁发机构即签发者的公钥计算证书得到摘要,和证书内的签名信息是否一致。
- 对证书签发者验证即验证证书签发者的证书,过程和上述类似。但是有一种特殊的证书是自签发的,此类证书无法进行签发者验证,被称为根证书,在下一节证书链中会详细介绍。
证书链
顾名思义,证书链就是一组证书列表组成的链,证书链是为了解决信任链问题的。
在现实中,基于大量的证书签发需求和不同国家地区证书签发政策差异的背景,签发证书的CA机构是采用多级的。多级的签发结构引入的新问题就是如何确定签发的证书是可信任的,信任链正是解决此问题的。
其实信任链在日常生活中有很多的体现,比如你信任街道居委会的合法性的原因,是因为它得到一个由区政府签发的证明或文件;你信任区政府的原因是它得到一个由市政府签发的证明或文件,然后依次是省政府,最后到国家,居委会-区政府-市政府-省政府-国家构成了一条信任链。
信任链
X.509证书体系中的信任链也是如此的,以百度证书为例,百度证书是由GlobalSign RSA OV SSL CA 2018机构签发的,而GlobalSign RSA OV SSL CA 2018 CA机构被GlobalSign CA机构授权和信任。因为你信任GlobalSign CA机构,它签发了GlobalSign RSA OV SSL CA 2018证书,所以信任GlobalSign RSA OV SSL CA 2018机构;它签发了baidu.com证书,所以信任百度证书以及使用该证书的网站
这里面一共有三种类型的组织以及对应的证书:
- 根证书颁发机构(Root CA):GlobalSign证书(根证书)
- 中间证书颁发机构:GlobalSign RSA OV SSL CA 2018证书(中间证书)
- 服务器实体:baidu.com证书(服务器实体证书)
牢记证书即身份 如GlobalSign证书即代表了GlobalSign根证书颁发机构身份
我们来依次查看下GlobalSign根证书和GlobalSign RSA OV SSL CA 2018中间证书的内容结构:
// GlobalSign根证书
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
04:00:00:00:00:01:21:58:53:08:a2
Signature Algorithm: sha256WithRSAEncryption
Issuer: OU=GlobalSign Root CA - R3, O=GlobalSign, CN=GlobalSign
Validity
Not Before: Mar 18 10:00:00 2009 GMT
Not After : Mar 18 10:00:00 2029 GMT
Subject: OU=GlobalSign Root CA - R3, O=GlobalSign, CN=GlobalSign
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
...
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Key Usage: critical
Certificate Sign, CRL Sign
X509v3 Basic Constraints: critical
CA:TRUE
X509v3 Subject Key Identifier:
8F:F0:4B:7F:A8:2E:45:24:AE:4D:50:FA:63:9A:8B:DE:E2:DD:1B:BC
Signature Algorithm: sha256WithRSAEncryption
...
可以看到根证书的签发者Issuer和身份Subject内容是一样的,说明根证书是自签发的,它是信任链的信任锚:即你必须信任该证书,否则信任链无法成立。
// GlobalSign RSA OV SSL CA 2018中间证书
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
01:ee:5f:22:1d:fc:62:3b:d4:33:3a:85:57
Signature Algorithm: sha256WithRSAEncryption
Issuer: OU=GlobalSign Root CA - R3, O=GlobalSign, CN=GlobalSign
Validity
Not Before: Nov 21 00:00:00 2018 GMT
Not After : Nov 21 00:00:00 2028 GMT
Subject: C=BE, O=GlobalSign nv-sa, CN=GlobalSign RSA OV SSL CA 2018
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
...
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Key Usage: critical
Digital Signature, Certificate Sign, CRL Sign
X509v3 Basic Constraints: critical
CA:TRUE, pathlen:0
X509v3 Subject Key Identifier:
F8:EF:7F:F2:CD:78:67:A8:DE:6F:8F:24:8D:88:F1:87:03:02:B3:EB
X509v3 Authority Key Identifier:
keyid:8F:F0:4B:7F:A8:2E:45:24:AE:4D:50:FA:63:9A:8B:DE:E2:DD:1B:BC
Authority Information Access:
OCSP - URI:http://ocsp2.globalsign.com/rootr3
X509v3 CRL Distribution Points:
Full Name:
URI:http://crl.globalsign.com/root-r3.crl
X509v3 Certificate Policies:
Policy: X509v3 Any Policy
CPS: https://www.globalsign.com/repository/
Signature Algorithm: sha256WithRSAEncryption
...
中间证书结构和普通的服务器实体证书类似,主要差别在于具备签发下级证书的能力CA:TRUE
。
信任链校验
这些证书构成的证书链。生成证书时按序从上到下生成,验证证书时自下而上验证:
一般是服务端发送完整的证书链,浏览器依次利用上级证书的公钥验证证书,直到根证书,根证书必须被信任(浏览器/系统内置或者存在于本地证书池)
证书吊销
证书吊销一般发生在某个网站或者CA的私钥泄漏了,导致该网站证书或该CA签发的证书都存在风险。目前证书吊销验证的方案主要有两种:
- CRL(Certificate Revocation List,证书吊销列表):CRL是一个结构化的文件,每家CA机构都将被吊销的证书列表放到一个文件里面,这就是CRLs(Certificate Revocation Lists)。CRLs其实就是一个证书黑名单,由CA机构发布,该文件在互联网上有一个URL地址,地址就在证书里面,以百度证书为例,CRLs文件地址为crl.globalsign.com/gsrsaovsslc… 证书验证者需要根据CRLs验证证书的合法性。但是CRL机制存在不少问题,一是文件更新时效性低,另外CRL文件会越来越大,导致影响TLS握手效率
- OCSP(Online Certificate Status Protocol,在线证书状态协议):OCSP和CRL一样,也是PKI技术的一部分,CRL目前已经逐步被OCSP淘汰。OCSP相当于不用下载一个很大的证书黑名单文件,而是直接向OCSP服务端发起证书吊销验证请求。由于OCSP机制会导致浏览器发起大量的证书吊销验证请求,会对OCSP服务造成压力,现一般采用OCSP封套技术,OCSP封套相比标准OCSP来说,不是由浏览器发出OCSP请求,而是由证书部署者即服务器负责发出OCSP请求
总结
以上就是关于证书的全部内容了,有关证书操作实践相关内容有兴趣的同学可以参考下之前的文章X.509数字证书标准。下一节我们介绍HTTPS中证书验证以及TLS/SSL握手的全过程~