004-零失敗快速搞定萬用字元SSL證書

趙安家發表於2019-02-18

這是堅持技術寫作計劃(含翻譯)的第四篇,定個小目標999,每週最少2篇。

過去幾年中,我們一直主張站點採用 HTTPS,以提升其安全性。去年的時候,我們還通過將更大的 HTTP 頁面標記為‘不安全’以幫助使用者。 不過從 2018 年 7 月開始,隨著 Chrome 68 的釋出,瀏覽器會將所有 HTTP 網站標記為‘不安全’。 引用自 chrome 68 釋出說明

得益於Google等大廠的消滅HTTP運動和Let's Encrypt 非盈利組織的努力,越來越多的站點開始遷移到HTTPS,下圖是Let's Encrypt的統計資料

image.png

什麼是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值(圖中打碼部分)

image.png

$ 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  \
				-d  example.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>;

    ....
}
複製程式碼

檢查HTTPS得分

訪問 www.ssllabs.com/ssltest/ 提交自己域名,進行評分

參考資料

招聘小廣告

山東濟南的小夥伴歡迎投簡歷啊 加入我們 , 一起搞事情。

長期招聘,Java程式設計師,大資料工程師,運維工程師,前端工程師。

相關文章