身份认证和HTTPS证书校验

本文阅读量 Posted by Kird on 2020-01-15
通过例子告诉你https证书的校验过程,原创

HTTPS解决什么问题

HTTPS解决两个问题:

  • 加密传输
    保证客户端和服务器之间的信息不是明文传输,保证信息的机密性
  • 身份认证
    HTTPS协议能够证明服务端的身份,防止假冒网站冒充自己的身份。

对称加密算法

这一部分需要密码学的基础,本段仅做相关总结。
对称加密因为密钥只有一个,存在密钥被枚举出来的问题,加密安全性不够高。
常见的对称加密有 DES,3DES,AES
因为性能比非对称加密高,所以用在HTTPS内容加密上,HTTPS通过非对称加密算法做密钥协商生成密钥,用作页面内容的对称加密。

非对称加密算法

常见的非对称加密算法都是基于数学难题,在当前计算能力下破解较难,常见的算法有RSA,ECC等。
抽象出几个名词概念:公钥,私钥。
公钥和私钥可以通过数学算法计算相互对明文密文进行数学计算并验证。
加密:
通过公钥(或私钥)对明文计算(如RSA)生成密文
解密:
通过另一个密钥对密文进行计算生成明文
上面加解密的概念是相对的,在日常应用中,常见的两个场景:

  • 发送方通过接收方公钥对明文加密,接收方通过自己的私钥进行解密
  • 需要身份认证的场景下,用自己的私钥对待签名的内容进行电子签章,需要验证的时候,验证者获取签名者的公钥进行验证(公钥对密文进行数学计算解密)

非对称加密算法的场景 – 身份认证和PKI

身份认证

上节提到非对称加密算法的一个场景是数字签名,数字签名是身份认证的手法。因为自己的私钥是别人不知道的也是别人不可复制的,如同人的指纹一样,是能代表自己本人的。
但是问题来了?我想让别人拿着我的公钥和我进行加密通信,对方是如何知道这是我的公钥呢?

怎么证明我是我?

证明我是我,只能拿着本人的身份证去派出所查询,然后让官方出具一份“本人证明”,因为有关部门是可信的,所以如果官方说这个是合法的,那就能证明这就是我。

那么电子世界的有这个官方机构吗?有!

PKI基础设施

PKI是安全世界的基础设施,CA机构是其主要成员,CA机构通过向申请证明“我就是我”的用户颁发证书,用户通过校验证书的有效性,来判断是否是自己需要通信的对方。
当然,CA是盈利机构,企业申请证书证明“我就是我”需要花费不少费用的,当然,不差钱!

证书颁发

证书内容:
证书 = 使用者公钥 + 主体信息如公司名称等 + CA对信息的确认签名 + 指纹

证书颁发流程大概分为:

  • 申请者生成CSR,申请时填写公司主体身份信息,生成CSR和私钥,CSR内容相当于公钥和身份信息。
  • 选择CA证书签发机构,如亚马逊,Globalsign,或免费机构
  • 提交CSR,CA会验证公司主体信息,没问题后会对申请者提交上来的CSR进行签名,生成web服务器能部署的公钥
  • 发送给申请者

可见在可信官方CA机构的签发下,大家看到这个证书后都可以认为这就是你本人没错了。客户端都内置可信机构的根证书,所以承认这个官方机构,这个在之后的信任链部分会详细介绍。

但是问题又来了,随着HTTPS越来越多,颁发机构忙不过来怎么办? 各国之间语言沟通障碍怎么办?
如同现实世界,官方机构会授权子公司或者新开总公司分部,同理,CA机构们也会增加自己的分公司,从而产生了中级证书和交叉证书的概念。
中级证书:不使用根证书的私钥对申请者的CSR进行签名,而采用中级证书对申请者的CSR进行签名颁发证书
交叉证书:不同根证书之间的相互签名,改变信任起始点

信任链和信任锚

由于中级证书的采用,整个证书有效性校验流程里有了信任链的概念,信任链就是客户端从服务器实体证书向上逐级校验,每一级证书校验过程是通过拿到证书签发者(Issuer)的证书中的公钥(证书 = 使用者公钥 + 主体信息如公司名称等 + CA对信息的确认签名 + 指纹)对本级证书(Subject)的签名进行数学验证,验证成功即证书有效。整个一级一级验证上去,形成信任链。直到一个证书的签发者和使用者是同一个人,则这个点为信任锚,即信任链的起始点,起始点需要在客户端系统或者浏览器的根证书信任列表中,整个流程结束后,证书可信。

PS:不同浏览器(客户端)的可信根证书列表是不同的,Chrome读取系统中的根证书列表,而FireFox浏览器则使用自己浏览器内置的可信根证书列表。

Nginx部署证书和校验分析

Nginx服务器证书部署使用base64编码格式的证书。通过CA颁发证书后获得一个base64格式的证书,和私钥一起部署在服务器中。

1
2
3
ssl on;
ssl_certificate /opt/soft/ssl/0xfe.com.cn_chain.crt;
ssl_certificate_key /opt/soft/ssl/0xfe.com.cn_key.key;

0xfe.com.cn_chain.crt为公钥文件,0xfe.com.cn_key.key为私钥文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
cat /opt/soft/ssl/0xfe.com.cn_chain.crt
-----BEGIN CERTIFICATE-----
MIIFpjCCBI6gAwIBAgIQBjLXXyMcU5DDZQ7gshcXdTANBgkqhkiG9w0BAQsFADBy
MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg
SW5jLjEdMBsGA1UECxMURG9tYWluIFZhbGlkYXRlZCBTU0wxHTAbBgNVBAMTFFRy
dXN0QXNpYSBUTFMgUlNBIENBMB4XDTE5MDgxNjAwMDAwMFoXDTIwMDgxNTEyMDAw
MFowFjEUMBIGA1UEAxMLMHhmZS5jb20uY24wggEiMA0GCSqGSIb3DQEBAQUAA4IB
DwAwggEKAoIBAQDcNNv3Ap4P+LRHrPHPWwuHHZhexQiSCPBAba/kSAcXjFAxaI7o
NdyiuBmUhPoGeV3YvIpzV9nsgcar94yDWef/L6Dl5SpVlHYYudgDwa+MKibhPGaL
ncW3urpPok3LFngSz63n2xg77Of4gEcOOeMPdzUb9UT6tKrZlPKXRjrGXKbLTwTj
AQo4MhvmS8ZddmaRjCTSxhJrZ8n4W2YfgBjITZEqNDDQyhxkS5Sr8/8OQ8wfn38c
rrd6FMAgnjnEZZVi3ivd4+XEz+g/DNE/m7+8cmRuHfG8ELXjGnswquJstgllNyUl
qumW3dfE9YVIJlQkvEQWFMsw5dzxHidJWTFLAgMBAAGjggKSMIICjjAfBgNVHSME
GDAWgBR/05nzoEcOMQBWViKOt8ye3coBijAdBgNVHQ4EFgQUlKhM50RH3AC7pIcy
qEoULdttwXUwJwYDVR0RBCAwHoILMHhmZS5jb20uY26CD3d3dy4weGZlLmNvbS5j
bjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC
MEwGA1UdIARFMEMwNwYJYIZIAYb9bAECMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8v
d3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCAYGZ4EMAQIBMIGSBggrBgEFBQcBAQSBhTCB
gjA0BggrBgEFBQcwAYYoaHR0cDovL3N0YXR1c2UuZGlnaXRhbGNlcnR2YWxpZGF0
aW9uLmNvbTBKBggrBgEFBQcwAoY+aHR0cDovL2NhY2VydHMuZGlnaXRhbGNlcnR2
YWxpZGF0aW9uLmNvbS9UcnVzdEFzaWFUTFNSU0FDQS5jcnQwCQYDVR0TBAIwADCC
AQQGCisGAQQB1nkCBAIEgfUEgfIA8AB2AO5Lvbd1zmC64UJpH6vhnmajD35fsHLY
gwDEe4l6qP3LAAABbJg76VwAAAQDAEcwRQIhAO5fxTuzbUnz6fna1BAyOzzAxoSw
N1xo0lnXrMr2bVBrAiAe2PWp7rCX0eMzO+ZdICzFwQtcULLHSGehHv8CgMqbNQB2
AId1v+dZfPiMQ5lfvfNu/1aNR1Y2/0q1YMG06v9eoIMPAAABbJg76eAAAAQDAEcw
RQIhAItx6WPv2a2nKIBRVDuvns5D4fElzlPAHMVM9gKDA4HcAiB/D+n/UCFAH5YY
L6r+vLKgLRJCfq5Vw0kaLWA+P3a5RDANBgkqhkiG9w0BAQsFAAOCAQEAllOZKfyY
hoyC5/FRnEhoY/6v/kbzPlVsgZvUVtk3IDnyo7GOaUUigQaLSmL0oWTnwmMOweb7
UhP1TL+RCYcw2fc39l4FIaOKjMmSaPLZw2Fm9Lk/ie5BZ3pLD5A3exz4nMgVjJB6
XC0ZiBgTsCOl3K3vFefL4x4ewoR0KwN5fTwkxKKT7XUCMTcIOMgWX2ubUXhjM2cy
c9lRPTy2joO4za9AS6sR5JExLY/kJ3dR7t99gko5MnJZINcPD8WIUySw5oQZA22Y
OhFVBGiERcH+oD6TNoZuqu2pSfrAIFT3dWpb1bGgiCxblsN2yH1REXmnTx3bmuy2
UAXfwUlUhtmRbw==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIErjCCA5agAwIBAgIQBYAmfwbylVM0jhwYWl7uLjANBgkqhkiG9w0BAQsFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0xNzEyMDgxMjI4MjZaFw0yNzEyMDgxMjI4MjZaMHIxCzAJBgNVBAYTAkNO
MSUwIwYDVQQKExxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMR0wGwYDVQQL
ExREb21haW4gVmFsaWRhdGVkIFNTTDEdMBsGA1UEAxMUVHJ1c3RBc2lhIFRMUyBS
U0EgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgWa9X+ph+wAm8
Yh1Fk1MjKbQ5QwBOOKVaZR/OfCh+F6f93u7vZHGcUU/lvVGgUQnbzJhR1UV2epJa
e+m7cxnXIKdD0/VS9btAgwJszGFvwoqXeaCqFoP71wPmXjjUwLT70+qvX4hdyYfO
JcjeTz5QKtg8zQwxaK9x4JT9CoOmoVdVhEBAiD3DwR5fFgOHDwwGxdJWVBvktnoA
zjdTLXDdbSVC5jZ0u8oq9BiTDv7jAlsB5F8aZgvSZDOQeFrwaOTbKWSEInEhnchK
ZTD1dz6aBlk1xGEI5PZWAnVAba/ofH33ktymaTDsE6xRDnW97pDkimCRak6CEbfe
3dXw6OV5AgMBAAGjggFPMIIBSzAdBgNVHQ4EFgQUf9OZ86BHDjEAVlYijrfMnt3K
AYowHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDgYDVR0PAQH/BAQD
AgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAG
AQH/AgEAMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3Au
ZGlnaWNlcnQuY29tMEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2lj
ZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RDQS5jcmwwTAYDVR0gBEUwQzA3Bglg
hkgBhv1sAQIwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29t
L0NQUzAIBgZngQwBAgEwDQYJKoZIhvcNAQELBQADggEBAK3dVOj5dlv4MzK2i233
lDYvyJ3slFY2X2HKTYGte8nbK6i5/fsDImMYihAkp6VaNY/en8WZ5qcrQPVLuJrJ
DSXT04NnMeZOQDUoj/NHAmdfCBB/h1bZ5OGK6Sf1h5Yx/5wR4f3TUoPgGlnU7EuP
ISLNdMRiDrXntcImDAiRvkh5GJuH4YCVE6XEntqaNIgGkRwxKSgnU3Id3iuFbW9F
UQ9Qqtb1GX91AJ7i4153TikGgYCdwYkBURD8gSVe8OAco6IfZOYt/TEwii1Ivi1C
qnuUlWpsF1LdQNIdfbW3TSe0BhQa7ifbVIfvPWHYOu3rkg1ZeMo6XRU9B4n5VyJY
RmE=
-----END CERTIFICATE-----
1
2
3
4
cat /opt/soft/ssl/0xfe.com.cn_key.key
-----BEGIN RSA PRIVATE KEY-----
省略
-----END RSA PRIVATE KEY-----

公钥文件中,-----BEGIN CERTIFICATE----------END CERTIFICATE-----之间即为一个证书,第一个必须为域名实体证书,后面的依次为中级证书或交叉证书,经测试,第一个域名实体证书顺序必须放第一个,后续中级证书可相互调换顺序,通常增加中间证书建议追加到最后面。
CER在线读取工具
将上述第一段输入到在线读取工具中,输出如下:

1
2
3
4
5
6
7
8
CER解码结果:

通用名 :0xfe.com.cn
可用域名 :DNS:0xfe.com.cn, DNS:www.0xfe.com.cn
有效时间段 :2019-08-16 - 2020-08-15
序列号 :8239351073242680476627775209099171701
颁发者 :TrustAsia TLS RSA CA
有效期 :2020-08-15 20:00:00

将上述第二段输入到在线读取工具中,输出如下:

1
2
3
4
5
6
7
8
CER解码结果:

通用名 :TrustAsia TLS RSA CA
公司组织名 :TrustAsia Technologies, Inc.
有效时间段 :2017-12-08 - 2027-12-08
序列号 :7311534772508790650765434802415791662
颁发者 :DigiCert Global Root CA
有效期 :2027-12-08 20:28:26

可见上述,两端base64证书分别对应域名实体证书和中级证书。

1
2
上述证书信任链为:
0xfe.com.cn <----校验---- TrustAsia TLS RSA CA <----校验---- DigiCert Global Root CA (存在系统或浏览器中)

客户端通过TrustAsia TLS RSA CA证书中的公钥验证0xfe.com.cn证书中的签名,通过
客户端通过DigiCert Global Root CA证书中的公钥验证TrustAsia TLS RSA CA证书中的签名,通过。
上面的DigiCert Global Root CA称为根证书。

为了校验上述流程,可通过禁用系统的根证书,下图将DigiCert Global Root CA禁用,标为不信任,可见浏览器将0xfe.com.cn标记为不信任。

百度网站证书分析举例

可见百度证书校验信任链为:

baidu.com <----校验---- GlobalSign Organization Validation CA - SHA256 - G2 <----校验---- GlobalSign Root CA (存在系统或浏览器中)

客户端通过GlobalSign Organization Validation CA - SHA256 - G2证书中的公钥验证baidu.com证书中的签名,通过;

客户端通过GlobalSign Root CA证书中的公钥验证GlobalSign Organization Validation CA - SHA256 - G2证书中的签名,通过。

上面的GlobalSign Root CA称为根证书。

使用GlobalSign CA 交叉证书改变信任锚

MAC系统最新内置的GlobalSign CA有5个:

组织单位分别称为:

1
2
3
4
5
Root CA 
GlobalSign Root CA - R2
GlobalSign ECC Root CA - R5
GlobalSign ECC Root CA - R4
GlobalSign Root CA - R3

即R1到R5,FireFox浏览器中还存在R6

也就是说Gloabalsign一共有这些根证书在使用。

存在以下场景需使用交叉证书:

GlobalSign在根CA启用颁发证书的过程中,会出现客户端没有来得及更新根CA的情况,如客户端只存在R1到R3三个根证书,缺少其他几个根证书,这个时候使用较新根证书如R4颁发的域名证书会被客户端标记为不安全,这时候GlobalSign会提供交叉证书,将信任锚从较新CA根证书如R4指向到客户端存在的根证书R1上,解决客户端无法访问的问题。

下面将用一个例子直观的表示这个场景:

1
baidu.com <----校验----  GlobalSign Organization Validation CA - SHA256 - G2  <----校验----  GlobalSign Root CA - R4 (GlobalSign Root CA - R4不存在客户端中)

GlobalSign Root CA - R4不存在客户端可信任根证书列表中,所以信任链不完整,无法正常访问,如何在无需重新签发中级证书GlobalSign Organization Validation CA - SHA256 - G2的情况下解决客户端问题呢?根据上面的分析,只需要在Nginx服务器公钥文件后面增加交叉证书的base64编码版本即可,此时信任链会新会增加一级,将信任锚点从R4根证书转移到R1根证书。

在部署nginx时增加一段交叉证书,改变信任锚,修改后的信任链将为:

1
baidu.com <----校验----  GlobalSign Organization Validation CA - SHA256 - G2  <----校验---- R1-R4交叉证书<----校验---- Root CA  (Root CA 为GlobalSign Root CA R1,存在于系统中)

即使用R1-R4交叉证书签名且验证GlobalSign Organization Validation CA - SHA256 - G2,使用Root CA签名且验证R1-R4交叉证书,将信任锚点从R4根证书转移到R1根证书,R1根证书存在于系统中,所以可以解决因为较新CA根证书颁发的证书不可信问题。

备注:
GlobalSign2019年5月27日迁移签发 SSL 证书的中级 CA,使用 RSA 算法密钥的 OV SSL 证书将在新的中级 CA 下签发,该中级 CA 将链到 GlobalSign R3 根证书下。如使用此算法颁发的证书,请保持系统中R3根证书存在,在这之前颁发的证书中的中级证书链到 GlobalSign R1 根证书下。
变更如下图:
更改前,中级证书链到R1根证书:

更改后,中级证书链到R3根证书:

使用GlobalSign CA 的用户请注意变更带来的影响,可增加GlobalSign R1R3交叉证书到证书文件,解决客户端不存在R3根证书的问题。



支付宝打赏 微信打赏

赞赏支持一下