主頁 > 軟體設計 > HTTPS原理

HTTPS原理

2021-07-24 08:32:17 軟體設計

文章目錄

  • 一.密碼學基礎
    • 明文
    • 密文
    • 密鑰
    • 對稱加密
    • 非對稱加密
  • 二.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在傳輸的程序中會涉及到三個密鑰:

  • 服務器端的公鑰和私鑰,用來進行非對稱加密
  • 客戶端生成的隨機密鑰,用來進行對稱加密

一個HTTPS請求實際上包含了兩次HTTP傳輸,可以細分為8步:

  1. 客戶端向服務器發起HTTPS請求,連接到服務器的443埠
  2. 服務器端有一個密鑰對,即公鑰和私鑰,是用來進行非對稱加密使用的,服務器端保存著私鑰,不能將其泄露,公鑰可以發送給任何人,
  3. 服務器將自己的公鑰發送給客戶端,
  4. 客戶端收到服務器端的證書之后,會對證書進行檢查,驗證其合法性,如果發現發現證書有問題,那么HTTPS傳輸就無法繼續,嚴格的說,這里應該是驗證服務器發送的數字證書的合法性,如果公鑰合格,那么客戶端會生成一個隨機值,這個隨機值就是用于進行對稱加密的密鑰,我們將該密鑰稱之為client key,即客戶端密鑰,然后用服務器的公鑰對客戶端密鑰進行非對稱加密,這樣客戶端密鑰就變成密文了,至此,HTTPS中的第一次HTTP請求結束,
  5. 客戶端會發起HTTPS中的第二個HTTP請求,將加密之后的客戶端密鑰發送給服務器,
  6. 服務器接收到客戶端發來的密文之后,會用自己的私鑰對其進行非對稱解密,解密之后的明文就是客戶端密鑰,然后用客戶端密鑰對資料進行對稱加密,這樣資料就變成了密文,
  7. 然后服務器將加密后的密文發送給客戶端,
  8. 客戶端收到服務器發送來的密文,用客戶端密鑰對其進行對稱解密,得到服務器發送的資料,這樣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 是一個受信任的根證書,

流程如下:

  1. 用戶訪問 https://jinping.xyz,服務器回傳 CA 給的證書鏈,其中包含了 jinping.xyz 證書以及中間證書;
  2. 瀏覽器首先需要判斷 jinping.xyz 的證書是不是可信的,關鍵的一步就是要解密證書的簽名部分,因為證書是由中間證書簽發的,所以要用中間證書里面的公鑰來進行解密;
  3. 第 2 步初步判斷了 jinping.xyz 的證書是合法的,但是,這個是基于中間證書合法的基礎上來的,所以接下來要判斷中間證書是否是合法的;
  4. 根據中間證書里面的資訊,可以知道它是由 DST Root CA X3 簽發的,由于證書鏈只有兩個節點,所以要到作業系統的根證書庫中查找,由于這個證書是一個使用非常廣泛的根證書,所以在系統中可以找到它,然后利用根證書的公鑰來解密中間證書的簽名部分,進而判斷中間證書是否合法,如果合法,整個流程就通了

我們思考一下:

  • 這個系統要作業好,關鍵就是最終一定要走到本地根證書庫,一環驗證一環,實作整個鏈路證書的可信任;
  • 中間證書有多少層都可以,只要能一直傳遞到根證書就行;
  • 本地的根證書是由作業系統內置的,如果你的使用場景中,根證書不在系統預裝里面,需要手動匯入根證書;
  • 另外,我這里使用了作業系統內置這個說法,其實也不準確吧,各大瀏覽器廠商可以自己內置這個根證書庫,這樣我想信任誰就信任誰,而不是聽 Microsoft、Apple… 這些作業系統廠商的,

腦洞大開一下,如果你想開一家 CA 公司,技術上是沒什么成本的,但是你要說服各大作業系統、瀏覽器廠商,把你家的根證書內置到里面,這就有點難了,當然,還有另一條路可以走,那就是不要搞根證書,基于某個 CA 搞個中間證書,然后用這個中間證書去簽發證書就可以了,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/289751.html

標籤:其他

上一篇:【前端】—每日5道面試題打卡(十六)

下一篇:04-JWT技術分析及應用實踐

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more