這是堅持技術寫作計劃(含翻譯)的第四篇,定個小目標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 \
-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/ 提交自己域名,進行評分
參考資料
- Chrome 將不再標記 HTTPS 頁面為安全站點
- Let's Encrypt Stats
- About Let's Encrypt
- Mozilla SSL Configuration Generator
- DV型、OV型、EV型證照的主要區別
- Neilpang/acme.sh#Wiki#安裝說明
- Neilpang/acme.sh#Wiki#How to Install
- Neilpang/acme.sh#Wiki#How to use DNS API
招聘小廣告
山東濟南的小夥伴歡迎投簡歷啊 加入我們 , 一起搞事情。
長期招聘,Java程式設計師,大資料工程師,運維工程師,前端工程師。