HTTPS證書申請原理
1、制作CSR文件
所謂CSR就是由申請人制作的Certificate Secure Request證書請求文件。制作過程中,系統(tǒng)會產(chǎn)生2個密鑰,一個是公鑰就是這個CSR文件,另外一個是私鑰,存放在服務(wù)器上。要制作CSR文件,申請人可以參考WEB SERVER的文檔,一般APACHE等,使用OPENSSL命令行來生成KEY+CSR 2個文件,Tomcat,JBoss,Resin等使用KEYTOOL來生成JKS和CSR文件,IIS通過向?qū)Ы⒁粋€掛起的請求和一個CSR文件。

2、CA認(rèn)證
將CSR提交給CA,CA一般有2種認(rèn)證方式:
- 1)域名認(rèn)證:一般通過對管理員郵箱認(rèn)證的方式,這種方式認(rèn)證速度快,但是簽發(fā)的證書中沒有企業(yè)的名稱;
- 2)企業(yè)文檔認(rèn)證:需要提供企業(yè)的營業(yè)執(zhí)照。
也有需要同時認(rèn)證以上2種方式的證書,叫EV ssl證書,這種證書可以使IE7以上的瀏覽器地址欄變成綠色,所以認(rèn)證也最嚴(yán)格。
華為云SSL 證書申請流程

- 登錄管理控制臺。
- 單擊頁面左上方的,選擇“安全與合規(guī) > 云證書管理服務(wù)”,進(jìn)入云證書管理界面
CCM。
- 單擊頁面左上方的,選擇“安全與合規(guī) > 云證書管理服務(wù)”,進(jìn)入云證書管理界面
- 在左側(cè)導(dǎo)航欄選擇“
SSL證書管理”,進(jìn)入SSL證書管理頁面。
- 在左側(cè)導(dǎo)航欄選擇“
- 在證書列表左上角,單擊 “創(chuàng)建測試證書”,進(jìn)入創(chuàng)建測試證書對話框界面。 “創(chuàng)建測試證書”按鈕處顯示的數(shù)字表示測試證書剩余可創(chuàng)建數(shù)量和可累計創(chuàng)建總數(shù)量。例如數(shù)字顯示為“
13/20”,表示剩余可創(chuàng)建13張測試證書,可累計創(chuàng)建20張測試證書。
- 在證書列表左上角,單擊 “創(chuàng)建測試證書”,進(jìn)入創(chuàng)建測試證書對話框界面。 “創(chuàng)建測試證書”按鈕處顯示的數(shù)字表示測試證書剩余可創(chuàng)建數(shù)量和可累計創(chuàng)建總數(shù)量。例如數(shù)字顯示為“

- 閱讀并勾選“我已閱讀并同意《云證書管理服務(wù)(
CCM)免責(zé)聲明》”,單擊“確認(rèn)”。
- 閱讀并勾選“我已閱讀并同意《云證書管理服務(wù)(
- 您在
SSL證書列表中可查看到創(chuàng)建成功的免費測試證書。
申請證書結(jié)果
- 您在
自簽名證書
創(chuàng)建根證書
(1)創(chuàng)建根證書私鑰:
openssl genrsa -out root.key 1024
(2)創(chuàng)建根證書請求文件:
openssl req -new -out root.csr -key root.key
后續(xù)參數(shù)請自行填寫,下面是一個例子:
Country Name (2 letter code) [XX]:cn
State or Province Name (full name) []:sgw
Locality Name (eg, city) [Default City]:sgw
Organization Name (eg, company) [Default Company Ltd]:shiguiwu
Organizational Unit Name (eg, section) []:test
Common Name (eg, your name or your servers hostname) []:root
Email Address []:2406749643@qq.com
A challenge password []:
An optional company name []:
(3)創(chuàng)建根證書:
openssl x509 -req -in root.csr -out root.crt -signkey root.key -CAcreateserial -days 3650
在創(chuàng)建證書請求文件的時候需要注意三點,下面生成服務(wù)器請求文件和客戶端請求文件均要注意這三點:
- 根證書的
Common Name填寫root就可以,所有客戶端和服務(wù)器端的證書這個字段需要填寫域名,一定要注意的是,根證書的這個字段和客戶端證書、服務(wù)器端證書不能一樣; -
其他所有字段的填寫,根證書、服務(wù)器端證書、客戶端證書需保持一致 - 最后的密碼可以直接回車
跳過。
經(jīng)過上面三個命令行,我們最終可以得到一個簽名有效期為10年的根證書root.crt,后面我們可以用這個根證書去頒發(fā)服務(wù)器證書和客戶端證書。
生成自簽名服務(wù)器端證書
(1)生成服務(wù)器端證書私鑰:
openssl genrsa -out server.key 1024
(2) 生成服務(wù)器證書請求文件,過程和注意事項參考根證書,本節(jié)不詳述:
openssl req -new -out server.csr -key server.key
(3) 生成服務(wù)器端公鑰證書:
openssl x509 -req -in server.csr -out server.crt -signkey server.key -CA root.crt -CAkey root.key -CAcreateserial -days 3650
經(jīng)過上面的三個命令,可以在當(dāng)前目錄查看,我們得到:
-
server.key:服務(wù)器端的密鑰文件 -
server.crt:有效期十年的服務(wù)器端公鑰證書,使用根證書和服務(wù)器端私鑰文件一起生成
證書驗證過程原理
如下圖圖所示,為數(shù)字證書簽發(fā)和驗證流程:

當(dāng)服務(wù)端向
CA 機構(gòu)申請證書的時候,CA簽發(fā)證書的過程,如上圖左邊部分:
- 首先
CA會把持有者的公鑰、用途、頒發(fā)者、有效時間等信息打成一個包,然后對這些信息進(jìn)行 Hash 計算,得到一個 Hash 值; - 然后 CA 會使用自己的私鑰將該 Hash 值加密,生成
Certificate Signature,也就是CA對證書做了簽名; - 最后將
Certificate Signature添加在文件證書上,形成數(shù)字證書;
客戶端校驗服務(wù)端的數(shù)字證書的過程,如上圖右邊部分:
- 首先客戶端會使用同樣的
Hash算法獲取該證書的Hash值H1; - 通常瀏覽器和操作系統(tǒng)中集成了
CA的公鑰信息,瀏覽器收到證書后可以使用CA的公鑰解密Certificate Signature內(nèi)容,得到一個Hash值H2; - 最后比較
H1 和 H2,如果值相同,則為可信賴的證書,否則則認(rèn)為證書不可信。
證書鏈
但事實上,證書的驗證過程中還存在一個證書信任鏈的問題,因為我們向CA申請的證書一般不是根證書簽發(fā)的,而是由中間證書簽發(fā)的,比如百度的證書,從下圖你可以看到,證書的層級有三級:

對于這種三級層級關(guān)系的證書的驗證過程如下:
- 客戶端收到
http://baidu.com的證書后,發(fā)現(xiàn)這個證書的簽發(fā)者不是根證書,就無法根據(jù)本地已有的根證書中的公鑰去驗證http://baidu.com證書是否可信。于是,客戶端根據(jù)http://baidu.com證書中的簽發(fā)者,找到該證書的頒發(fā)機構(gòu)是 “GlobalSign Organization Validation CA - SHA256 - G2”,然后向 CA 請求該中間證書。 - 請求到證書后發(fā)現(xiàn) “GlobalSign Organization Validation CA - SHA256 - G2” 證書是由 “GlobalSign Root CA” 簽發(fā)的,由于 “GlobalSign Root CA” 沒有再上級簽發(fā)機構(gòu),說明它是根證書,也就是自簽證書。應(yīng)用軟件會檢查此證書有否已預(yù)載于根證書清單上,如果有,則可以利用根證書中的公鑰去驗證 “GlobalSign Organization Validation CA - SHA256 - G2” 證書,如果發(fā)現(xiàn)驗證通過,就認(rèn)為該中間證書是可信的。
- “GlobalSign Organization Validation CA - SHA256 - G2” 證書被信任后,可以使用 “GlobalSign Organization Validation CA - SHA256 - G2” 證書中的公鑰去驗證
http://baidu.com證書的可信性,如果驗證通過,就可以信任http://baidu.com證書。
在這四個步驟中,最開始客戶端只信任根證書GlobalSign Root CA證書的,然后 “GlobalSign Root CA” 證書信任 “GlobalSign Organization Validation CA - SHA256 - G2” 證書,而 “GlobalSign Organization Validation CA - SHA256 - G2” 證書又信任http://baidu.com證書,于是客戶端也信任http://baidu.com證書。總括來說,由于用戶信任GlobalSign,所以由GlobalSign所擔(dān)保的 http://baidu.com可以被信任,另外由于用戶信任操作系統(tǒng)或瀏覽器的軟件商,所以由軟件商預(yù)載了根證書的GlobalSign都可被信任。

這樣的一層層地驗證就構(gòu)成了一條信任鏈路,整個證書信任鏈驗證流程如下圖所示:

如果你的電腦中毒了,被惡意導(dǎo)入了中間人的根證書,那么在驗證中間人的證書的時候,由于你操作系統(tǒng)信任了中間人的根證書,那么等同于中間人的證書是合法的。
這種情況下,瀏覽器是不會彈出證書存在問題的風(fēng)險提醒的。
這其實也不關(guān)
HTTPS的事情,是你電腦中毒了才導(dǎo)致 HTTPS 數(shù)據(jù)被中間人劫持的。所以,
HTTPS協(xié)議本身到目前為止還是沒有任何漏洞的,即使你成功進(jìn)行中間人攻擊,本質(zhì)上是利用了客戶端的漏洞(用戶點擊繼續(xù)訪問或者被惡意導(dǎo)入偽造的根證書),并不是HTTPS不夠安全。
