004-零失敗快速搞定通配符SSL證書

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

過去幾年中,咱們一直主張站點採用 HTTPS,以提高其安全性。去年的時候,咱們還經過將更大的 HTTP 頁面標記爲‘不安全’以幫助用戶。 不過從 2018 年 7 月開始,隨着 Chrome 68 的發佈,瀏覽器會將全部 HTTP 網站標記爲‘不安全’。 引用自 chrome 68 發佈說明html

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

image.png

什麼是Let's Encrypt

部署 HTTPS 網站的時候須要證書,證書由 CA 機構簽發,大部分傳統 CA 機構簽發證書是須要收費的,這不利於推進 HTTPS 協議的使用。nginx

Let's Encrypt是一個國外的非盈利的CA證書機構,旨在以自動化流程消除手動建立和安裝證書的複雜流程,並推廣使萬維網服務器的加密鏈接無所不在,爲安全網站提供免費的SSL/TLS證書。git

由Linux基金會託管,許多國內外互聯網大廠都對其進行贊助,目前主流瀏覽器均已信任Let's Encrypt發放的證書。程序員

注意,Let's Encrypt頒發的都是DV證書,不提供OV,EV證書。github

本文主要講解 如何使用Let's Encrypt頒發通配符證書。chrome

通配符證書

通配符SSL證書旨在保護主域名以及旗下不限數量的子域,即用戶可經過單個通配符SSL證書可保護任意數量的子域。若是用戶擁有多個子域名平臺,可經過通配符SSL證書保護這些子域名。api

可是目前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程序員,大數據工程師,運維工程師,前端工程師。

相關文章
相關標籤/搜索