天天看點

HTTPS配置全記錄

HTTPS配置全記錄

環境

常見的部署環境和條件有以下幾種情況組合:

  • Apache+自簽名證書
  • Apache+免費或商業證書
  • Nginx+自簽名證書
  • Nginx+免費或商業證書

免費證書和商業證書本質上是一樣的,都是可以被系統承認的證書,隻是申請方式不同而已。

證書

證書結構

配置一個HTTPS服務所需要的證書包括幾個部分:

  • Server Key(伺服器私鑰)
  • CSR(Certificate Signing Request)
  • CRT(X509 Certificate)

建立證書的基本流程是這樣:

  • 生成自己的服務端私鑰
  • 輸入基本資訊并用私鑰簽名生成CSR
  • 送出CSR給證書機構CA(免費或商業證書)簽名生成CRT,或自己做CA簽名生成CRT(自簽名證書)

其中前兩個步驟都是一樣的,在這裡統一說明一下。

生成伺服器私鑰:

openssl genrsa -out server.key 4096
           

輸出的server.key檔案就是伺服器私鑰,4096是密鑰長度,要求不高的話用2048也可。

生成CSR:

openssl req -new -sha256 -key server.key -out yoursite.csr
           

因為sha1已經不安全,是以這裡用了sha256,可能太舊的用戶端(比如win98?)會不支援。

yoursite.csr就是生成的CSR,yoursite建議用你的網站名辨別會比較友善識别。

然後按提示輸入:

  • 國家
  • 公司
  • 部門
  • 通用名(即網站域名,這個必須準确,有些商業證書支援在這裡用帶www的域名後簽發出同時支援不帶www的域名)
  • email
  • 密碼(可選,設定的話以後重新開機webserver都需要輸入密碼)

自簽名證書做法

生成CRT:

openssl x509 -req -days 3650 -in yoursite.csr -signkey server.key -out yoursite.crt
           

其中簽名用的KEY就是自己的服務端私鑰,是以這是一個自簽名證書。

有效期為3650天(即十年)。

免費證書生成

參見舊文《Let’s HTTPS》。

商業證書生成

首先找一個商業證書機構(CA)或其代理商下一個證書訂單。

其次是選擇證書類型。

證書類型

商業證書有很多類型,也有很多的CA可以選擇,不同的CA,不同的類型價格也不一樣。

常見的CA有:

  • VeriSign(Symantec)
  • GeoTrust(RapidSSL)
  • Comodo
  • ……

以上以價格從高到低排序。除此之外當然還有很多,具體可以打開你的系統證書清單看看。

需要特别說一句的就是:臭名昭著的CNNIC和沃通(WoSign,包括免費的StartSSL),已經被證明不安全,建議将它們從系統中删除,并且不要去申請使用它們的證書。

常見的證書類型有三種:

  • DV(域名驗證)
  • OV(組織驗證)
  • EV(擴充驗證)

驗證級别從低到高排序,價格也是如此。

DV證書隻驗證域名,在最終通路者那邊檢視證書時将不會包含CSR中的組織資訊,隻有域名資訊,也就是說你就算是在CSR裡輸入你是GOOGLE,到了用戶端那裡也是看不到的。

OV證書除了驗證域名還需要驗證組織,即你需要提供證據證明你在CSR裡輸入的公司或組織的确是你, 這樣才能在用戶端證書裡檢視到你的組織資訊。

EV證書就要求更高了,通常是金融機構之類的用。

除此之外,證書還有一種差別:

  • 單域名證書
  • 多域名證書
  • 泛域名證書

一樣是價格從高到低排序。

單域名證書就是隻能用于一個域名的證書,某些商業證書可以提供兩個域名:帶WWW的和不帶WWW的。

多域名證書就是一個證書可以用于多個域名,預設支援三個域名,當然增加域名需要加錢,但比單獨買單域名證書要便宜。适用于一個公司有多個域名,而且多個域名部署在一個伺服器上,使用一個證書會比較省事,也比較便宜。

泛域名證書就是一個證書可以用于一個域名下的任意多個子域名。

申請流程

一般申請流程(僅指DV類型)如下:

  • 選擇CA或代理商
  • 選擇證書類型
  • 選擇有效期(以年為機關,一般時間越長單價越便宜)
  • 下單付款
  • 成交後按服務商的郵件或文檔開始驗證域名(以下為一種流程,不同服務商可能不太一樣)
    • 上傳CSR(或用服務商提供的工具生成,但不推薦)
    • 選擇驗證方式(EMAIL,檔案,DNS等)
    • 按相應方式操作
    • 等待驗證
    • 取得證書(郵件或從服務商處自行下載下傳)

其中各驗證方式大緻如下:

  • Email:證書機構向域名注冊郵箱或域名的webmaster等郵箱(可選)發送驗證郵件
  • 檔案:在域名的指定路徑下放驗證檔案供證書機構通路
  • DNS:建立指定的DNS TXT記錄供證書機構驗證

通過驗證後即可獲得證書。

證書内容一般包括:域名的CRT,證書機構的CRT鍊(可能有多個),根證書CRT(CA的證書),如果用服務商的工具生成CSR,還應該會有CSR和KEY。

部署

分别以最常用的Apache和Nginx為例,其它WebServer請參考相關文檔。

Apache

這裡隻介紹Apache2(以2.4為例)。

HTTPS的基本配置可以直接套用預設配置,隻是要改一下證書檔案的部分:

SSLEngine on
SSLCertificateFile  /path_to_ssl/yoursite.crt
SSLCertificateKeyFile /path_to_ssl/yoursite.key
SSLCertificateChainFile /path_to_ssl/server-ca.crt
           

其中yoursite.crt和yoursite.key就是前面說過的私鑰和域名證書。

重點說一下server-ca.crt,這個就是前面談到商業證書時提到的中間證書鍊(包括CA根證書)。對于Let’s Encrypt這樣的免費證書,這個就是Let’s Encrypt的證書(見舊文),對于自簽名證書,這一項可以去掉。

中間證書鍊的生成方法如下:

cat provider.crt provider-parent.crt root.crt > server-ca.crt
           

很簡單,就是把那一堆證書串起來生成一個證書檔案即可,不過需要注意順序,從最低級的證書(你的域名證書的上一級)開始到最進階的CA根證書。

Apache從2.2.12開始支援SNI,可以為多個域名的虛拟主機使用各自獨立的證書,用法與HTTP虛拟主機類似,隻需要在每個虛拟主機配置裡加上相應的證書配置即可。

需要注意的是:WinXP,JAVA6,Android 2.3等不支援SNI。

最後,如我在去年的舊文裡所說,SSLv2/v3之類的協定和某些SSL加密算法已經不再安全,是以在沒有特定的相容性需要的情況下,需要配置禁用這些不安全的選項。

在全局配置(注意,不是單個虛拟主機配置裡)裡加上:

SSLProtocol TLSv1 +TLSv1.1 +TLSv1.2
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:!DHE-RSA-AES128-GCM-SHA256:!DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:!DHE-RSA-AES128-SHA256:!DHE-RSA-AES128-SHA:!DHE-DSS-AES128-SHA256:!DHE-RSA-AES256-SHA256:!DHE-DSS-AES256-SHA:!DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
           

以上協定和加密算法都是目前還安全的,并且提供了最大可能的相容性。未來如果出現新的安全問題,請自行調整。

Nginx

基本上在舊文裡都說過了,這裡再總結一下。

相比Apache的配置,Nginx沒有單獨的中間證書鍊項目,是以是把中間證書鍊和域名證書串在一起作為完整的域名證書來用:

cat yoursite.crt server-ca.crt > new_yoursite.crt
           

配置HTTPS:

ssl on;
ssl_certificate "/path_to_ssl/new_yoursite.crt";
ssl_certificate_key "/path_to_ssl/yoursite.key";
           

SNI配置見舊文,從略。

全局安全配置:

ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers  ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:!DHE-RSA-AES128-GCM-SHA256:!DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:!DHE-RSA-AES128-SHA256:!DHE-RSA-AES128-SHA:!DHE-RSA-AES256-SHA256:!DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS;
           

配置完成後重新開機服務即可生效。

不論是用Apache還是Nginx,都建議配置完HTTPS以後到SSL Labs驗證一下安全性。

繼續閱讀