文章目錄
- 一.密碼學基礎
- 明文
- 密文
- 密鑰
- 對稱加密
- 非對稱加密
- 二.HTTPS通信程序
- 三.CA
- 1.CA需要做什么
- 2.證書申請
- 3.證書組成
- 4.檔案內容
- 四.HTTPS驗證程序
HTTP請求都是明文傳輸的,所謂的明文指的是沒有經過加密的資訊,如果HTTP請求被黑客攔截,并且里面含有銀行卡密碼等敏感資料的話,會非常危險,為了解決這個問題,Netscape 公司制定了HTTPS協議,HTTPS可以將資料加密傳輸,也就是傳輸的是密文,即便黑客在傳輸程序中攔截到資料也無法破譯,這就保證了網路通信的安全,
一.密碼學基礎
明文
明文指的是未被加密過的原始資料
密文
明文被某種加密演算法加密之后,會變成密文,從而確保原始資料的安全,密文也可以被解密,得到原始的明文,
密鑰
密鑰是一種引數,它是在明文轉換為密文或將密文轉換為明文的演算法中輸入的引數,密鑰分為對稱密鑰與非對稱密鑰,分別應用在對稱加密和非對稱加密上,
對稱加密
對稱加密又叫做私鑰加密,即資訊的發送方和接收方使用同一個密鑰去加密和解密資料,對稱加密的特點是演算法公開、加密和解密速度快,適合于對大資料量進行加密,常見的對稱加密演算法有DES、3DES、TDEA、Blowfish、RC5和IDEA,
- 加密:明文+加密演算法+私鑰—>密文
- 解密:密文+解密演算法+私鑰—>明文
其加密程序中的私鑰與解密程序中用到的私鑰是同一個密鑰,這也是稱加密之所以稱之為“對稱”的原因,由于對稱加密的演算法是公開的,所以一旦私鑰被泄露,那么密文就很容易被破解,所以對稱加密的缺點是密鑰安全管理困難,
非對稱加密
非對稱加密也叫做公鑰加密,非對稱加密與對稱加密相比,其安全性更好,對稱加密的通信雙方使用相同的密鑰,如果一方的密鑰遭泄露,那么整個通信就會被破解,而非對稱加密使用一對密鑰,即公鑰和私鑰,且二者成對出現,
私鑰被自己保存,不能對外泄露,
公鑰指的是公共的密鑰,任何人都可以獲得該密鑰,
用公鑰或私鑰中的任何一個進行加密,用另一個進行解密,
公鑰和私鑰是一一對應的
被公鑰加密過的密文只能被私鑰解密,程序如下:
- 明文 + 加密演算法 + 公鑰 —> 密文, 密文 + 解密演算法 + 私鑰 —> 明文
被私鑰加密過的密文只能被公鑰解密,程序如下:
- 明文 + 加密演算法 + 私鑰 —> 密文, 密文 + 解密演算法 + 公鑰 —> 明文
由于加密和解密使用了兩個不同的密鑰,這就是非對稱加密“非對稱”的原因,
非對稱加密的缺點是加密和解密花費時間長、速度慢,只適合對少量資料進行加密,
在非對稱加密中使用的主要演算法有:RSA、Elgamal、Rabin、D-H、ECC(橢圓曲線加密演算法)等,
二.HTTPS通信程序
HTTPS協議 = HTTP協議 + SSL/TLS協議,在HTTPS資料傳輸的程序中,需要用SSL/TLS對資料進行加密和解密,需要用HTTP對加密后的資料進行傳輸,由此可以看出HTTPS是由HTTP和SSL/TLS一起合作完成的,
SSL的全稱是Secure Sockets Layer,即安全套接層協議,是為網路通信提供安全及資料完整性的一種安全協議,SSL協議在1994年被Netscape發明,后來各個瀏覽器均支持SSL,其最新的版本是3.0
TLS的全稱是Transport Layer Security,即安全傳輸層協議,最新版本的TLS(Transport Layer Security,傳輸層安全協議)是IETF(Internet Engineering Task Force,Internet工程任務組)制定的一種新的協議,它建立在SSL 3.0協議規范之上,是SSL 3.0的后續版本,在TLS與SSL3.0之間存在著顯著的差別,主要是它們所支持的加密演算法不同,所以TLS與SSL3.0不能互操作,雖然TLS與SSL3.0在加密演算法上不同,但是在我們理解HTTPS的程序中,我們可以把SSL和TLS看做是同一個協議,
HTTPS為了兼顧安全與效率,同時使用了對稱加密和非對稱加密,資料是被對稱加密傳輸的,對稱加密程序需要客戶端的一個密鑰,為了確保能把該密鑰安全傳輸到服務器端,采用非對稱加密對該密鑰進行加密傳輸,總的來說,對資料進行對稱加密,對稱加密所要使用的密鑰通過非對稱加密傳輸,

HTTPS在傳輸的程序中會涉及到三個密鑰:
- 服務器端的公鑰和私鑰,用來進行非對稱加密
- 客戶端生成的隨機密鑰,用來進行對稱加密
一個HTTPS請求實際上包含了兩次HTTP傳輸,可以細分為8步:
- 客戶端向服務器發起HTTPS請求,連接到服務器的443埠
- 服務器端有一個密鑰對,即公鑰和私鑰,是用來進行非對稱加密使用的,服務器端保存著私鑰,不能將其泄露,公鑰可以發送給任何人,
- 服務器將自己的公鑰發送給客戶端,
- 客戶端收到服務器端的證書之后,會對證書進行檢查,驗證其合法性,如果發現發現證書有問題,那么HTTPS傳輸就無法繼續,嚴格的說,這里應該是驗證服務器發送的數字證書的合法性,如果公鑰合格,那么客戶端會生成一個隨機值,這個隨機值就是用于進行對稱加密的密鑰,我們將該密鑰稱之為
client key,即客戶端密鑰,然后用服務器的公鑰對客戶端密鑰進行非對稱加密,這樣客戶端密鑰就變成密文了,至此,HTTPS中的第一次HTTP請求結束, - 客戶端會發起HTTPS中的第二個HTTP請求,將加密之后的客戶端密鑰發送給服務器,
- 服務器接收到客戶端發來的密文之后,會用自己的私鑰對其進行非對稱解密,解密之后的明文就是客戶端密鑰,然后用客戶端密鑰對資料進行對稱加密,這樣資料就變成了密文,
- 然后服務器將加密后的密文發送給客戶端,
- 客戶端收到服務器發送來的密文,用客戶端密鑰對其進行對稱解密,得到服務器發送的資料,這樣HTTPS中的第二個HTTP請求結束,整個HTTPS傳輸完成,
三.CA
CA是Certification Authority的縮寫,它代表世界上那些權威的證書頒發機構,
1.CA需要做什么
CA 要驗證這個域名真的是你的:通常就是通過 DNS 記錄或者就是你在指定 URI 下放置一個特殊檔案,讓 CA 可以在外網環境下訪問到它,
CA 是一個非常關鍵的角色,因為它簽出來的任何證書都是被信任的,所以這要求每個 CA 都不能亂來,
Let’s Encrypt 機構提供了免費的證書,那有什么區別呢?
Let’s Encrypt 它只驗證了這個域名是你的,然后就可以給你免費簽發證書,這個證書的有效期是 3 個月,到期要自己去更新,因為它只驗證了你的域名,所以這類證書又稱為 DV 證書(Domain Validation),
而一些收費的 CA 可以簽發 OV 證書(Organization Validation)或 EV 證書(Extended Validation),他們不僅會驗證這個域名真的是你的,還會人工驗證你的公司是否符合他們的各項簽發標準,所以收費也比較貴,通常這些證書的有效期是 1 年,
對于瀏覽器來說,通常會根據你的證書是 DV 還是 OV,來呈現不同的樣式,所以有一種花錢的證書更香的感覺,
但是從技術上來說,它們都是提供一樣的保護級別的,在最新的 Chrome 上,它沒有區別對待,一律顯示一個鎖,
2.證書申請
首先我們要生成一個 CSR,它的全稱是 Certificate Signing Request,這個檔案包含了你要申請的證書的各種資訊,這和在某個 CA 的后臺填寫一個申請表單是一個意思,只是這樣可以規范所有 CA 遵守一致的規則,
這里我們需要使用一個叫 openssl 的軟體,執行下面的命令:
openssl req -new -newkey rsa:2048 -nodes -keyout jinping.xyz.key -out jinping.xyz.csr

進入互動界面后,需要你填寫國家、城市、公司名字、部門名字、申請的域名、郵箱地址,有些 CA 支持中文,大部分不支持,這里建議都是用英文字符,
然后我們就會得到兩個文本檔案:
jinping.xyz.csr
jinping.xyz.key
其中一個是 CSR 檔案,用來發給 CA 申請證書的,另一個是私鑰,私鑰需要好好保存,等證書申請完成以后要用,
從域名的角度,證書分為單域名、通配符域名、多域名證書,以單域名 jinping.xyz 為例子,通配符和多域名也很好理解,在填寫域名的時候按照格式填就可以了,
生成出來的 jinping.xyz.csr 檔案,它的內容是這樣的
-----BEGIN CERTIFICATE REQUEST-----
MIIC+TCCAeECAQAwgYkxCzAJBgNVBAYTAmNuMRAwDgYDVQQIDAdiZWlqaW5nMQ4w
DAYDVQQHDAVjaGluYTEQMA4GA1UECgwHeW9uZ2h1aTEQMA4GA1UECwwHc2VjdGlv
bjEQMA4GA1UEAwwHamlucGluZzEiMCAGCSqGSIb3DQEJARYTamlucGluZzA5ODJA
MTYzLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANC5kvprdmFm
gk+W0Fw1Co+kj2h97jj5ibZtoytUyq3nlHEXdrXMqnsz1sR4mBa3J8qbQZ2FkEB4
ShU7gynTS+zlI7Vq7tU29TC1vZGhNUo3TlhSj412VXxjImlCvh+gAhQbHkkFsMlv
n3YNphdlI/Du36jYcecJ1J4CznY6RYdPstbqBeltVuREFZL6gr34n8WDRlU333pI
jONMnwFa8JVmQO/6TOvJn7xfc9HMdq7Uvz7RLk0mOdCY8NfW5603/IoFxQ5YaLGh
ULb9v0omprxGiTm+keC0m6LB3Y0JFZdkOwyGkznEsLJ+vZ7NA11YGKKb4zmLjNg1
pQp1aavWxBECAwEAAaAqMBEGCSqGSIb3DQEJAjEEDAJ5aDAVBgkqhkiG9w0BCQcx
CAwGMDUwNDAxMA0GCSqGSIb3DQEBCwUAA4IBAQBvL6QvPB+weRBudlPTEYv4GEY3
I5JxhdxAB57wWzDmn96xRuChlPMyRHd6XiMXM2nnv02GCNDyPP6Zx6C80rQFbNvz
qa9298wGhFX2jRFXVW/Z1zsdn1sXk2B3Pa7dW0FEgAN+uc+CbV2HALdtRvAiFxvc
enWm9aMShhk2rpl0NPZ1Xa5bY0zM+Ew3Qq/W0zCuJVLuV+7Rf8CRP1RNZD7FoEST
miKvBTE0fG0WAjdPmXznAfbraP/cljdMk+Ccn9tQ+SgCfa5aedXPAFxgs1KW1LJ3
vi6X5Jvoz0BhABNPz3xVYGqOV82/UR+MP5PVZvbXO6lWLghmXj2twSwH4pXy
-----END CERTIFICATE REQUEST-----
進入 https://decoder.link/result 進行 decode,可以得到:
Certificate Request:
Data:
Version: 1 (0x0)
Subject: C = cn, ST = beijing, L = china, O = yonghui, OU = section, CN = jinping, emailAddress = jinping0982@163.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:d0:b9:92:fa:6b:76:61:66:82:4f:96:d0:5c:35:
0a:8f:a4:8f:68:7d:ee:38:f9:89:b6:6d:a3:2b:54:
ca:ad:e7:94:71:17:76:b5:cc:aa:7b:33:d6:c4:78:
98:16:b7:27:ca:9b:41:9d:85:90:40:78:4a:15:3b:
83:29:d3:4b:ec:e5:23:b5:6a:ee:d5:36:f5:30:b5:
bd:91:a1:35:4a:37:4e:58:52:8f:8d:76:55:7c:63:
22:69:42:be:1f:a0:02:14:1b:1e:49:05:b0:c9:6f:
9f:76:0d:a6:17:65:23:f0:ee:df:a8:d8:71:e7:09:
d4:9e:02:ce:76:3a:45:87:4f:b2:d6:ea:05:e9:6d:
56:e4:44:15:92:fa:82:bd:f8:9f:c5:83:46:55:37:
df:7a:48:8c:e3:4c:9f:01:5a:f0:95:66:40:ef:fa:
4c:eb:c9:9f:bc:5f:73:d1:cc:76:ae:d4:bf:3e:d1:
2e:4d:26:39:d0:98:f0:d7:d6:e7:ad:37:fc:8a:05:
c5:0e:58:68:b1:a1:50:b6:fd:bf:4a:26:a6:bc:46:
89:39:be:91:e0:b4:9b:a2:c1:dd:8d:09:15:97:64:
3b:0c:86:93:39:c4:b0:b2:7e:bd:9e:cd:03:5d:58:
18:a2:9b:e3:39:8b:8c:d8:35:a5:0a:75:69:ab:d6:
c4:11
Exponent: 65537 (0x10001)
Attributes:
unstructuredName :yh
challengePassword :050401
Signature Algorithm: sha256WithRSAEncryption
6f:2f:a4:2f:3c:1f:b0:79:10:6e:76:53:d3:11:8b:f8:18:46:
37:23:92:71:85:dc:40:07:9e:f0:5b:30:e6:9f:de:b1:46:e0:
a1:94:f3:32:44:77:7a:5e:23:17:33:69:e7:bf:4d:86:08:d0:
f2:3c:fe:99:c7:a0:bc:d2:b4:05:6c:db:f3:a9:af:76:f7:cc:
06:84:55:f6:8d:11:57:55:6f:d9:d7:3b:1d:9f:5b:17:93:60:
77:3d:ae:dd:5b:41:44:80:03:7e:b9:cf:82:6d:5d:87:00:b7:
6d:46:f0:22:17:1b:dc:7a:75:a6:f5:a3:12:86:19:36:ae:99:
74:34:f6:75:5d:ae:5b:63:4c:cc:f8:4c:37:42:af:d6:d3:30:
ae:25:52:ee:57:ee:d1:7f:c0:91:3f:54:4d:64:3e:c5:a0:44:
93:9a:22:af:05:31:34:7c:6d:16:02:37:4f:99:7c:e7:01:f6:
eb:68:ff:dc:96:37:4c:93:e0:9c:9f:db:50:f9:28:02:7d:ae:
5a:79:d5:cf:00:5c:60:b3:52:96:d4:b2:77:be:2e:97:e4:9b:
e8:cf:40:61:00:13:4f:cf:7c:55:60:6a:8e:57:cd:bf:51:1f:
8c:3f:93:d5:66:f6:d7:3b:a9:56:2e:08:66:5e:3d:ad:c1:2c:
07:e2:95:f2
主要包含三部分:
- 第一部分:Subject 中是我填寫的域名的基本資訊,這里面,我們只需要關注 CN 欄位就行:jinping,CN 是 Common Name 的縮寫,
- 第二部分:Subject Public Key Info 是公鑰部分,這里指定了服務器使用的加密演算法是 RSA,公鑰長度是 2048 位,
- 第三部分:簽名,使用了
sha256WithRSAEncryption演算法,也就是說首先將上面的所有資訊進行 sha256 散列得到 hash 值,然后使用 RSA 演算法對 hash 值進行加密,而加密的秘鑰就是之前生成的私鑰,
為什么這里要加第三部分的簽名?其實就是為了防止你的 CSR 檔案在發給 CA 的程序中被中間人攔截,然后修改了里面的資訊再發給 CA,
CA 的校驗程序是:利用里面的公鑰將簽名進行解密得到里面的散列值,然后 CA 也會利用 CSR 里面的資訊計算一遍散列值,如果兩者相等,那么說明證書沒有被中間人修改過,反之就是被修改過
3.證書組成
CA 收到我們的 CSR 檔案以后,CA 會進行審核,前面說過了,審核這個域名是不是你的,如果需要,還有人工審核公司資訊,審核通過后,它就會發給我們證書檔案了,每家 CA 出來的檔案名可能略有不同,但是表達的資訊是一樣的,
主要有以下幾個檔案:
域名證書:jinping.xyz.pem 或叫 cert.pem
證書鏈:fullchain.pem
這些檔案可能是 .pem 也可能是 .crt 后綴,但都是文本檔案,可以直接打開查看它們的資訊:
域名證書的檔案內容通常是這樣的:
-----BEGIN CERTIFICATE-----
MIIFTzCCBDegAwIBAgISAy4b8ie6L/ACCJt/V7x/OR0iMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
......
Ecbqh4AoB33mZhp9ptJb1N1RSlZREI0FlbX0kUd6VowKUPhH8Iex6jxQpJHwRkpq
YJaWKrUxGWuJurOcN7b3HXn6yw==
-----END CERTIFICATE-----
證書鏈檔案通常是這樣的:(證書鏈檔案的第一部分,和證書檔案的內容是一模一樣的,)
-----BEGIN CERTIFICATE-----
MIIFTzCCBDegAwIBAgISAy4b8ie6L/ACCJt/V7x/OR0iMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
.......
Ecbqh4AoB33mZhp9ptJb1N1RSlZREI0FlbX0kUd6VowKUPhH8Iex6jxQpJHwRkpq
YJaWKrUxGWuJurOcN7b3HXn6yw==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
.......
PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6
KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==
-----END CERTIFICATE-----
如果 CA 還給你發了 chain.pem 檔案,其實它的內容肯定就是證書鏈檔案內容裁減掉第一部分的證書內容而已,
我們需要的其實就是一個證書鏈,CA 給我們頒發的證書,其實就是一個證書鏈檔案
4.檔案內容
decode后的結果:
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
02:ac:5c:26:6a:0b:40:9b:8f:0b:79:f2:ae:46:25:77
Signature Algorithm: sha1WithRSAEncryption
//證書頒發機構
Issuer: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert High Assurance EV Root CA
//證書有效期
Validity
Not Before: Nov 10 00:00:00 2006 GMT
Not After : Nov 10 00:00:00 2031 GMT
// 證書申請資訊
Subject: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert High Assurance EV Root CA
// 公鑰
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:c6:cc:e5:73:e6:fb:d4:bb:e5:2d:2d:32:a6:df:
e5:81:3f:c9:cd:25:49:b6:71:2a:c3:d5:94:34:67:
a2:0a:1c:b0:5f:69:a6:40:b1:c4:b7:b2:8f:d0:98:
a4:a9:41:59:3a:d3:dc:94:d6:3c:db:74:38:a4:4a:
cc:4d:25:82:f7:4a:a5:53:12:38:ee:f3:49:6d:71:
91:7e:63:b6:ab:a6:5f:c3:a4:84:f8:4f:62:51:be:
f8:c5:ec:db:38:92:e3:06:e5:08:91:0c:c4:28:41:
55:fb:cb:5a:89:15:7e:71:e8:35:bf:4d:72:09:3d:
be:3a:38:50:5b:77:31:1b:8d:b3:c7:24:45:9a:a7:
ac:6d:00:14:5a:04:b7:ba:13:eb:51:0a:98:41:41:
22:4e:65:61:87:81:41:50:a6:79:5c:89:de:19:4a:
57:d5:2e:e6:5d:1c:53:2c:7e:98:cd:1a:06:16:a4:
68:73:d0:34:04:13:5c:a1:71:d3:5a:7c:55:db:5e:
64:e1:37:87:30:56:04:e5:11:b4:29:80:12:f1:79:
39:88:a2:02:11:7c:27:66:b7:88:b7:78:f2:ca:0a:
a8:38:ab:0a:64:c2:bf:66:5d:95:84:c1:a1:25:1e:
87:5d:1a:50:0b:20:12:cc:41:bb:6e:0b:51:38:b8:
4b:cb
Exponent: 65537 (0x10001)
// 這部分內容我們忽略
X509v3 extensions:
X509v3 Key Usage: critical
Digital Signature, Certificate Sign, CRL Sign
X509v3 Basic Constraints: critical
CA:TRUE
X509v3 Subject Key Identifier:
B1:3E:C3:69:03:F8:BF:47:01:D4:98:26:1A:08:02:EF:63:64:2B:C3
X509v3 Authority Key Identifier:
keyid:B1:3E:C3:69:03:F8:BF:47:01:D4:98:26:1A:08:02:EF:63:64:2B:C3
// 簽名
Signature Algorithm: sha1WithRSAEncryption
1c:1a:06:97:dc:d7:9c:9f:3c:88:66:06:08:57:21:db:21:47:
f8:2a:67:aa:bf:18:32:76:40:10:57:c1:8a:f3:7a:d9:11:65:
8e:35:fa:9e:fc:45:b5:9e:d9:4c:31:4b:b8:91:e8:43:2c:8e:
b3:78:ce:db:e3:53:79:71:d6:e5:21:94:01:da:55:87:9a:24:
64:f6:8a:66:cc:de:9c:37:cd:a8:34:b1:69:9b:23:c8:9e:78:
22:2b:70:43:e3:55:47:31:61:19:ef:58:c5:85:2f:4e:30:f6:
a0:31:16:23:c8:e7:e2:65:16:33:cb:bf:1a:1b:a0:3d:f8:ca:
5e:8b:31:8b:60:08:89:2d:0c:06:5c:52:b7:c4:f9:0a:98:d1:
15:5f:9f:12:be:7c:36:63:38:bd:44:a4:7f:e4:26:2b:0a:c4:
97:69:0d:e9:8c:e2:c0:10:57:b8:c8:76:12:91:55:f2:48:69:
d8:bc:2a:02:5b:0f:44:d4:20:31:db:f4:ba:70:26:5d:90:60:
9e:bc:4b:17:09:2f:b4:cb:1e:43:68:c9:07:27:c1:d2:5c:f7:
ea:21:b9:68:12:9c:3c:9c:bf:9e:fc:80:5c:9b:63:cd:ec:47:
aa:25:27:67:a0:37:f3:00:82:7d:54:d7:a9:f8:e9:2e:13:a3:
77:e8:1f:4a
證書中主要包含:
- 證書頒發機構:用于尋找鏈中的下一個驗證節點
- 證書的有效期:比如瀏覽器要根據這個值來判斷證書是否已過期
- 證書申請資訊:比如瀏覽器要判斷改證書是否可用于當前訪問的域名
- 公鑰:用于后續和服務端通信的秘鑰,這個公鑰和當初生成 CSR 時的公鑰是一個東西,因為只有它是和服務器的私鑰是一對的
- 簽名:用于驗證證書內容沒有被篡改
這里簡單說一說這個證書里面的公鑰和簽名:
前面在介紹生成 CSR 的時候,我們說過了,簽名部分,是服務器使用私鑰加密 hash 值得到的,同時在 CSR 中包含了公鑰,這樣 CA 在收到這個檔案后,可以用 CSR 檔案中的公鑰來解密簽名,進而做校驗,
而這里不一樣,這個證書是 CA 給我們的,自然這個簽名也是 CA 使用它自己的私鑰進行加密的,但是這里的公鑰是我們服務器的公鑰,顯然不能用于解密簽名,
那對于用戶瀏覽器來說,在收到這個證書以后,怎么校驗這個證書的簽名呢?顯然瀏覽器需要得到 CA 的公鑰,下一節我們就將詳細描述這個程序,
四.HTTPS驗證程序
下面將使用 jinping.xyz 這個域名的證書來分析,

首先,我們可以看到,這個證書鏈由 3 個證書組成,jinping.xyz 證書由中間證書 R3 簽發,中間證書由 DST Root CA X3 簽發,而 DST Root CA X3 是一個受信任的根證書,
流程如下:
- 用戶訪問 https://jinping.xyz,服務器回傳 CA 給的證書鏈,其中包含了 jinping.xyz 證書以及中間證書;
- 瀏覽器首先需要判斷 jinping.xyz 的證書是不是可信的,關鍵的一步就是要解密證書的簽名部分,因為證書是由中間證書簽發的,所以要用中間證書里面的公鑰來進行解密;
- 第 2 步初步判斷了 jinping.xyz 的證書是合法的,但是,這個是基于中間證書合法的基礎上來的,所以接下來要判斷中間證書是否是合法的;
- 根據中間證書里面的資訊,可以知道它是由 DST Root CA X3 簽發的,由于證書鏈只有兩個節點,所以要到作業系統的根證書庫中查找,由于這個證書是一個使用非常廣泛的根證書,所以在系統中可以找到它,然后利用根證書的公鑰來解密中間證書的簽名部分,進而判斷中間證書是否合法,如果合法,整個流程就通了
我們思考一下:
- 這個系統要作業好,關鍵就是最終一定要走到本地根證書庫,一環驗證一環,實作整個鏈路證書的可信任;
- 中間證書有多少層都可以,只要能一直傳遞到根證書就行;
- 本地的根證書是由作業系統內置的,如果你的使用場景中,根證書不在系統預裝里面,需要手動匯入根證書;
- 另外,我這里使用了作業系統內置這個說法,其實也不準確吧,各大瀏覽器廠商可以自己內置這個根證書庫,這樣我想信任誰就信任誰,而不是聽 Microsoft、Apple… 這些作業系統廠商的,
腦洞大開一下,如果你想開一家 CA 公司,技術上是沒什么成本的,但是你要說服各大作業系統、瀏覽器廠商,把你家的根證書內置到里面,這就有點難了,當然,還有另一條路可以走,那就是不要搞根證書,基于某個 CA 搞個中間證書,然后用這個中間證書去簽發證書就可以了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/289751.html
標籤:其他
下一篇:04-JWT技術分析及應用實踐
