004-零失敗快速搞定萬用字元SSL證書
這是堅持技術寫作計劃(含翻譯)的第四篇,定個小目標999,每週最少2篇。
過去幾年中,我們一直主張站點採用 HTTPS,以提升其安全性。去年的時候,我們還通過將更大的 HTTP 頁面標記為‘不安全’以幫助使用者。 不過從 2018 年 7 月開始,隨著 Chrome 68 的釋出,瀏覽器會將所有 HTTP 網站標記為‘不安全’。 引用自chrome 68 釋出說明
得益於Google等大廠的消滅HTTP運動和Let's Encrypt非盈利組織的努力,越來越多的站點開始遷移到HTTPS,下圖是 Let's Encrypt的統計資料

什麼是Let's Encrypt
部署 HTTPS 網站的時候需要證書,證書由 CA 機構簽發,大部分傳統 CA 機構簽發證書是需要收費的,這不利於推動 HTTPS 協議的使用。
Let's Encrypt是一個國外的非盈利的CA證書機構,旨在以自動化流程消除手動建立和安裝證書的複雜流程,並推廣使全球資訊網伺服器的加密連線無所不在,為安全網站提供免費的SSL/TLS證書。
由Linux基金會託管,許多國內外網際網路大廠都對其進行贊助,目前主流瀏覽器均已信任Let's Encrypt發放的證書。
注意,Let's Encrypt頒發的都是DV證書,不提供OV,EV證書。
本文主要講解 如何使用Let's Encrypt頒發萬用字元證書。
萬用字元證書
萬用字元SSL證書旨在保護主域名以及旗下不限數量的子域,即使用者可通過單個萬用字元SSL證書可保護任意數量的子域。如果使用者擁有多個子域名平臺,可通過萬用字元SSL證書保護這些子域名。
但是目前Let's Encrypt 只支援同級子域名萬用字元。例如 *.demo.com
只支援 xx.demo.com
這種的,而不支援 xx.xx.demo.com
,而要支援二級萬用字元,需要再次頒發二級萬用字元證書 類似 *.demo.demo.com
,注意,這種的二級萬用字元,要求,一級域名是固定的,意即,不支援 *.*.demo.com
使用acme.sh 簡化證書頒發操作
官方建議使用Certbot,但是很長一段時期Certbot不支援萬用字元(現在已經支援),而且對於證書自動續期支援的也不好。並且操作時也挺麻煩。
安裝acme.sh
$ curl https://get.acme.sh | sh # 或者 $ wget -O -https://get.acme.sh | sh # 或者 $ git clone https://github.com/Neilpang/acme.sh.git $ ./acme.sh/acme.sh --install 複製程式碼
DNS Api 頒發萬用字元證書
acme.sh 功能很強大,此處只介紹使用Dns Api 自動化頒發萬用字元證書. 目前支援包含阿里和DNSPod在內的60家dns服務商(參見 Currently acme.sh supports )
如果你的DNS服務商不提供API或者acme.sh暫未支援,或者處於安全方面的考慮,不想將重要的域名的API許可權暴露給acme.sh,可以申請一個測試域名,然後在重要域名上設定CNAME(參見 DNS alias mode )
假設您的域名在DNSPod託管,登陸DNSPod後臺,依次開啟 使用者中心->安全設定-> API Token->檢視->建立API Token-> 輸入任意token名稱->確定-> 儲存ID和Token值(圖中打碼部分)

$ export DP_Id="你的ID" $ export DP_Key="你的Token" $ acme.sh --issue --dns dns_dp -d example.com -d *.example.com # 如果 使用了DNS別名,還需要增加 --challenge-alias 別名域名 引數 # 為了防止dns不生效,指令碼會暫停2分鐘,並倒計時(Sleep 120 seconds for the txt records to take effect),等待即可 # 如果成功會出現 Cert success. 字樣 # 不建議直接用~/.acme.sh 下的證書,參考 https://github.com/Neilpang/acme.sh/wiki/說明#3-copy安裝-證書 # 需要使用 --installcert 複製到指定目錄 $ acme.sh --installcert\ -dexample.com -d *.example.com \ --key-file /etc/letsencrypt/live/example.com/privkey.pem \ --fullchain-file /etc/letsencrypt/live/example.com/fullchain.pem \ --reloadcmd"service nginx reload" 複製程式碼
優化HTTPS配置
本文以 Mozilla SSL Configuration Generator 生成的nginx為例,同樣也可以生成Apache和IIS
server { listen 80 default_server; listen [::]:80 default_server; # Redirect all HTTP requests to HTTPS with a 301 Moved Permanently response. return 301 https://$host$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; # certs sent to the client in SERVER HELLO are concatenated in ssl_certificate ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits # openssl dhparam -out /etc/letsencrypt/live/example.com/ 2048 ssl_dhparam /etc/letsencrypt/live/example.com/dhparam.pem; # intermediate configuration. tweak to your needs. 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'; ssl_prefer_server_ciphers on; # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months) add_header Strict-Transport-Security max-age=15768000; # OCSP Stapling --- # fetch OCSP records from URL in ssl_certificate and cache them ssl_stapling on; ssl_stapling_verify on; ## verify chain of trust of OCSP response using Root CA and Intermediate certs # ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates; resolver <IP DNS resolver>; .... } 複製程式碼