前言

在HTTPS資料傳輸的過程中,需要用SSL/TLS對資料進行加密和解密,以保證網路傳輸過程中資料的機密性。HTTPS協議可以大致分為兩個部分:其一是協商金鑰,首先當Client向Web Server發起請求時,Web Server向Client返回一個包含Server端公鑰的證書,然後Client驗證該證書的合法性並生成一個隨機金鑰,接著使用該證書對生成的隨機金鑰進行非對稱加密後傳送回Web Server,最後Web Server使用私鑰進行解密後獲取Client生成的隨機金鑰;其二是加密通訊,Web Server與Client端採用隨機金鑰進行對稱加解密進行通訊。HTTPS通訊流程圖如下,引用於Leon_hy的部落格。證書一般由第三方CA進行簽發,自簽證書將不被瀏覽器信任,會彈出連線不安全的小窗。本文介紹了Ubuntu 18.04使用OpenSSL自建CA且簽發證書的流程,併成功獲取谷歌等瀏覽器的信任。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

環境準備

1. OpenSSL依賴安裝

$ sudo apt-get install -y openssl libssl-dev

2. 建立證書儲存目錄及相關檔案

需要注意的是,以下除了certificate資料夾外,命名必須與/usr/local/ssl/openssl.cnf中的對應名稱保持一致,以下均採用預設值

$ cd ~
$ mkdir certificate && cd certificate
$ mkdir demoCA && cd demoCA
$ mkdir private newcerts
$ touch index.txt
$ echo '01' > serial

自建CA

1. 生成根金鑰

需要注意的是,此處的金鑰名必須與/usr/local/ssl/openssl.cnf中的名稱保持一致,預設為cakey.pem

$ cd private
$ openssl genrsa -out cakey.pem 2048

2. 生成根CA證書

$ openssl req -new -x509 -days 3650 -key cakey.pem -out cacert.pem

隨後按照指引填寫根CA證書的相關資訊,其中填寫內容不做要求(特別指出Common Name此處為根證書頒發機構,命名建議為XX Root CA)

3. 將根證書移動到demoCA資料夾下

$ cd .. && mv ./private/cacert.pem ./

新增信任

下面介紹兩種證書驗證場景下,新增信任的方式

1. Google瀏覽器(火狐瀏覽器類似)

設定->隱私設定和安全性->管理證書->匯入->下一步->瀏覽

注意此處谷歌瀏覽器預設匯入證書後綴為crt,可以選擇所有檔案後匯入cacert.pem檔案到受信任的根證書頒發機構並確認

2. OpenSSL預設證書驗證檔案(呼叫OpenSSL庫驗證證書合法性的應用將使用該檔案如curl等,注意在Ubuntu其他版本中ca-certificates.crt檔案可能又叫做ca-bundle.crt)

$ sudo sh -c "cat cacert.pem >> /etc/ssl/certs/ca-certificates.crt"

頒發證書

1. 切換出demoCA資料夾,到certificate資料夾

$ cd ~/certificate

2. 建立custom.ext檔案,新增多IP配置,檔案內容如下(如果需要配置多DNS域名解析,可以在[ SubjectAlternativeName ]下新增DNS.1 = www.XXX.com或者正則匹配式*.XXX.com)

 

 3. 建立私鑰

$ openssl genrsa -out custom.key 2048

4. 建立證書請求檔案

$ openssl req -new -key custom.key -out custom.csr

隨後按照指引填寫證書的相關資訊,填寫內容除了Common Name,其餘部分儘量與根證書保持一致(Common Name內容不做要求)

5. 簽發證書

$ openssl ca -in custom.csr -extfile custom.ext -days 365 -out custom.crt

簽發後的證書連同私鑰可以供Web Server使用

測試

1. google瀏覽器測試結果

 

2. 火狐瀏覽器測試結果