Ubuntu 18.04使用OpenSSL自簽證書(證書支援多IP及多域名,谷歌瀏覽器無警告)
前言
在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. 火狐瀏覽器測試結果