Let's Encrypt 給網站加 HTTPS 完全指南certbot

來源:互聯網
上載者:User

標籤:

Let‘s Encrypt 給網站加 HTTPS 完全指南29 MAY 2016

前段時間在北京聯通3G移動網路下,發現自己的網站被聯通劫持注入噁心的話費充值廣告,決定讓我的網站強制使用 HTTPS,避免 ISP 劫持。

使用 HTTPS 前的一些疑惑

現在是 2016 年,使用 HTTPS 已經不像幾年前是一件昂貴的事情。當然我也是自己瞭解了一圈才消除了自己的疑惑,主要是:

  1. 我的網站(一個簡單的部落格)可能沒必要使用 HTTPS
  2. HTTPS 會不會讓網站速度變慢?
  3. HTTPS 需要花錢吧?認證好像不便宜
  4. 配置和維護 HTTPS 代價很高

要回答這些問題,推薦大家去看一下 Google I/O 2016 的視頻(Youtube):Mythbusting HTTPS: Squashing security’s urban legends - Google I/O 2016

視頻裡把所有問題都詳細一一解答,強烈推家把視頻看完。

我簡單總結:

  1. 每個網站都應該用 HTTPS,就算是全靜態網站也同樣如此,電訊廠商劫持嚴重幹擾訪問者的體驗
  2. 有幾項技術可以提高 HTTPS 的效能,包括 Strict Transport SecurityTLS False Start 和 HTTP/2 ,這些技術讓 HTTPS 速度不慢,某些情況下會甚至更快
  3. HTTPS 針對個人單個(或者幾個)網域名稱的使用來說,已經是免費的
  4. 配置和維護 HTTPS 異常簡單,Let‘s Encrypt 這個項目通過自動化把事情簡單化了
有哪些靠譜的免費 HTTPS 認證供應商?

選擇認證供應商有3個主要考量:1. 瀏覽器和作業系統支援程度 2. 認證類型 3. 維護成本

1. 瀏覽器和作業系統支援程度

基本你能查到的熱門認證供應商,支援程度都不會太差。例如 Let‘s Encrypt 的支援可以訪問:Which browsers and operating systems support Let’s Encrypt

可以看到,Android 2.3.6 以上,Firefox 2.0 以上,Windows Vista 以上,iOS 3.1 以上,Google Chrome全平台都是支援的。這一點就不用太擔心了,看你你的網站受眾情況來決定。對於我來說,我完全不在乎 Windows XP 的 IE 使用者。

2. 認證類型

HTTPS 認證分為3類, 1. DV 網域名稱驗證認證 2. OV 組織機構驗證認證 3. EV 增強組織機構驗證認證。每類認證在審核和驗證方面要求嚴格程度不同,瀏覽器會在地址欄給予不同認證不一樣的展現。

一般個人使用DV認證完全夠了,瀏覽器表現為地址欄前會有綠色的小鎖。下面聊到的免費認證都是 DV 網域名稱驗證認證。

3. 維護成本

我調研不多,使用過 StartSSL,現在用 Let‘s EncryptStartSSL 的免費認證有效期間是1年,1年後需要手動更換。配置過程還挺麻煩的。

更推薦 Let‘s Encrypt,雖然有效期間只有3個月,但可以用 certbot 自動續期,完全不受影響。而且 Let‘s Encrypt 因為有了 certbot 這樣的自動化工具,組態管理起來非常容易。

產生 Let‘s Encrypt 認證

Let‘s Encrypt 認證產生不需要手動進行,官方推薦 certbot 這套自動化工具來實現。3步輕鬆搞定:

  1. 下載安裝 certbot (Let’s Encrypt項目的自動化工具)
  2. 建立設定檔
  3. 執行認證自動化產生命令

下面的教程運行在 Arch Linux 上,其他動作系統也大同小異。你可以在 certbot 網站上,選擇你的 Web Server 和 作業系統,就能看到對應的安裝和配置教程。

1. 下載安裝 certbot

在 Arch Linux 上,安裝很簡單:

$ sudo pacman -Syu$ sudo pacman -S letsencrypt
2. 建立設定檔

先建立存放設定檔的檔案夾:

$ sudo mkdir /etc/letsencrypt/configs

編輯設定檔:

$ sudo vim /etc/letsencrypt/configs/example.com.conf

把 example.com 替換成自己的網域名稱,設定檔內容:

# 寫你的網域名稱和郵箱domains = example.com  rsa-key-size = 2048  email = [email protected]  text = True# 把下面的路徑修改為 example.com 的目錄位置authenticator = webroot  webroot-path = /var/www/example  

這裡需要解釋一下,上面設定檔用了 webroot 的驗證方法,這種方法適用於已經有一個 Web Server 運行中的情況。certbot 會自動在 /var/www/example 下面建立一個隱藏檔案 .well-known/acme-challenge ,通過請求這個檔案來驗證 example.com 確實屬於你。外網伺服器訪問 http://www.example.com/.well-known/acme-challenge ,如果訪問成功則驗證OK。

我們不需要手動建立這個檔案,certbot 會根據設定檔自動完成。

3. 執行認證自動化產生命令

一切就緒,我們現在可以運行 certbot 了。(注意:certbot 其實是一個 Python 指令碼,在不同平台上的命令會不同,例如在 Arch Linux 上 certbot 的命令是 letsencrypt)。

$ sudo letsencrypt -c /etc/letsencrypt/configs/example.com.conf certonly## 片刻之後,看到下面內容就是成功了IMPORTANT NOTES:   - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/example.com/fullchain.pem.

如果運行順利,所有伺服器所需要的認證就已經產生好了。他們被放在了 /etc/letsencrypt/live/example.com/ 下:

$ ls /etc/letsencrypt/live/example.com/cert.pem #server cert only  privkey.pem #private key  chain.pem #intermediates  fullchain.pem #server cert + intermediates  
配置 Nginx 加入認證

到這裡已經成功一大半了,只需要配置 Nginx 支援剛剛產生的認證。而且這個配置有最佳實務可以參考,訪問:Mozilla SSL Configuration Generator,這是 Mozilla 搞得一個 HTTPS 設定檔自動產生器,支援 Apache,Nginx 等多種伺服器。按照這個設定檔,選擇 Intermediate 的相容性。這裡產生的設定檔是業界最佳實務和結果,讓 Nginx 開啟了各種增加安全性和效能的參數。

預設設定檔是這樣的:

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 /path/to/signed_cert_plus_intermediates;    ssl_certificate_key /path/to/private_key;    ssl_session_timeout 1d;    ssl_session_cache shared:SSL:50m;    ssl_session_tickets off;    # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits    ssl_dhparam /path/to/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>;    ....}

請根據自己的服務配置修改和新增內容,重點只需要關注6行:

server {      listen 443 ssl http2;    ....    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;    ssl_dhparam /etc/nginx/ssl/dhparam.pem;    ssl_trusted_certificate /etc/letsencrypt/live/example.com/root_ca_cert_plus_intermediates;    resolver <IP DNS resolver>;    ....}

這6行中,部分檔案還不存在,逐個說明。

首先是第一行 listen 443 ssl http2;  作用是啟用 Nginx 的 ngxhttpv2_module 模組 支援 HTTP2,Nginx 版本需要高於 1.9.5,且編譯時間需要設定 --with-http_v2_module 。Arch Linux 的 Nginx 安裝包中已經編譯了這個模組,可以直接使用。如果你的 Linux 發行版本中的 Nginx 並不支援這個模組,可以自行 Google 如何加上。

ssl_certificate 和 ssl_certificate_key ,分別對應 fullchain.pem 和 privkey.pem,這2個檔案是之前就產生好的認證和密鑰。

ssl_dhparam 通過下面命令產生:

$ sudo mkdir /etc/nginx/ssl$ sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048

(可選)ssl_trusted_certificate 需要下載 Let‘s Encrypt 的 Root Certificates,不過根據Nginx 官方文檔 所說,ssl_certificate 如果已經包含了 intermediates 就不再需要提供 ssltrustedcertificate 了。這一步可以省略:

$ cd /etc/letsencrypt/live/example.com$ sudo wget https://letsencrypt.org/certs/isrgrootx1.pem$ sudo mv isrgrootx1.pem root.pem$ sudo cat root.pem chain.pem > root_ca_cert_plus_intermediates

resolver 的作用是 “resolve names of upstream servers into addresses”, 在這個配置中,resolver 是用來解析 OCSP 服務器的網域名稱的,建議填寫你的 VPS 供應商的 DNS 伺服器,例如我的 VPN 在 Linode,DNS伺服器填寫:

resolver 106.187.90.5 106.187.93.5;

Nginx 配置完成後,重啟後,用瀏覽器測試是否一切正常。

$ sudo systemctl restart nginx

這時候你的網站應該預設強制使用了 HTTPS,並且瀏覽器地址欄左邊會有綠色的小鎖:

自動化定期更新認證

Let‘s Encrypt 認證有效期間是3個月,我們可以通過 certbot 來自動化續期。

在 Arch Linux 上,我們通過 systemd 來自動執行認證續期任務。

$ sudo vim /etc/systemd/system/letsencrypt.service
[Unit]Description=Let‘s Encrypt renewal[Service]Type=oneshot  ExecStart=/usr/bin/letsencrypt renew  ExecStartPost=/bin/systemctl reload nginx.service  

然後增加一個 systemd timer 來觸發這個服務:

$ sudo vim /etc/systemd/system/letsencrypt.timer
[Unit]Description=Monthly renewal of Let‘s Encrypt‘s certificates[Timer]OnCalendar=daily  Persistent=true[Install]WantedBy=timers.target  

啟用服務,開啟 timer:

$ sudo systemctl enable letsencrypt.service$ sudo systemctl start letsencrypt.timer

在其他 Linux 發行版本中,可以使用 crontab 來設定定時任務,自行 Google 吧。

用專業線上工具測試你的伺服器 SSL 安全性

Qualys SSL Labs 提供了全面的 SSL 安全性測試,填寫你的網站網域名稱,給自己的 HTTPS 配置打個分。

如果你完全按照我上面教程配置,遵循了最佳實務,你應該和我一樣得分是 A+

這意味著你啟用了HTTPS,現在足夠的安全,並且使用了最新技術,保證了效能。

為自己鼓個掌。 (??????)??

Let's Encrypt 給網站加 HTTPS 完全指南certbot

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.