申請 Let’s Encrypt SSL 不像一般的 SLL 申請作業要填一堆表單,取得憑證的過程通常是需要進主機安裝代理程式,當然也可以透過傳統的方式驗證網域,有了代理程式倒是方便很多,可以自動 Renew (預設憑證的期限是 90 天)。
代理程式就叫做 letsencrypt,當然也是 Open Source 囉 (GitHub)。
首先先安裝相依的套件,RedHat / CentOS 請透過以下命令:
sudo yum install gcc libffi-devel python-devel openssl-devel git
如果是 Ubuntu 可以透過以下命令:
sudo apt-get install gcc libffi-dev python-dev git
接著安裝代理程式,直接從 GitHub Clone 一份下來即可,如下:
cd /usr/share sudo git clone https://github.com/letsencrypt/letsencrypt letsencrypt
首先你的 Apache 可以先裝上 SSL Module,接著執行以下命令:
cd /usr/share/letsencrypt sudo ./letsencrypt-auto --apache -d domain.com
# cd letsencrypt # ./letsencrypt-auto --debug certonly --webroot --email xxx@xxx.com.tw -w /usr/local/www/tech.idv.tw -d tech.idv.tw -d www.tech.idv.tw 說明: 目前在FreeBSD的平台執行letsencrypt-auto指令時,須多加上「--debug」參數 「--email xxx@xxx.com.tw」請填上你的聯絡信箱 「-w /usr/local/www/tech.idv.tw」是指定你的網站存放的目錄 「-d tech.idv.tw」是指你要申請的網域名稱 「--agree-tos」加上這選項,表示直接同意該服務條款,不會跳出畫面讓你選擇 「--key-rsa-size 4096」加上這選項,可以指定RSA KEY的長度,預設是2048 申請憑證時,Let's Encrypt會在網站的目錄下產生一個「.well-known」的目錄並寫入驗證檔案,去驗證申請者是否擁有該網域名稱?因此,須將網站的80、443port開啟,讓Let's Encrypt可以正常連線讀取驗證檔案(驗證完檔案即刪除) 完成驗證後,會將該網站的憑證檔案放在/etc/letsencrypt/live/tech.idv.tw目錄下(cert.pem及chain.pem是Apache使用;fullchain.pem及privkey.pem是Nginx使用)
參數 -d 表示指定要安裝的網頁服務 Domain Name,加上 –apache 將會自動搜尋系統中的 Apache 設定檔 (當然也提供 Nginx, Haproxy 等等常用的網頁伺服器),自動找出 Virtual Host 設定檔自動加上 SSL 連線設定,注意喔:letsencrypt-auto 程式會搜尋單一個設定檔,你的設定檔必須只包含一個 VirtualHost 設定才行,不然程式無法正確判斷。
編輯tech.idv.tw網站的設定檔,加入SSL憑證的設定 # vi /usr/local/etc/nginx/nginx.conf server { listen 80; server_name tech.idv.tw www.tech.idv.tw; add_header Strict-Transport-Security "max-age=31536000"; #時間設定為365天,以秒為單位 return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name tech.idv.tw www.tech.idv.tw; add_header Strict-Transport-Security "max-age=31536000"; #時間設定為365天,以秒為單位 ### 設定憑證的路徑 ssl_certificate /etc/letsencrypt/live/tech.idv.tw/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/tech.idv.tw/privkey.pem; ### 設定支援的協定及Cipher ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDH+AESGCM:EDCH+AES256:ECDH+AES128:!MD5:!aNULL; ssl_prefer_server_ciphers on; ### 啟用SSL快取 ssl_session_cache shared:SSL:10m; ssl_session_timeout 1h; ### 啟用OCSP stapling ssl_stapling on; ssl_stapling_verify on; ... ... } 說明: 第一個server{}是強制將HTTP的連線轉至HTTPS加密連線 第二個server{}中設定SSL相關的所有設定,包含憑證位置、支援的協定…等 加了「add_header Strict-Transport-Security」,之後檢測SSL憑證時,可以獲得「A+」等級。詳細說明,請參考https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security
安裝完之後我們可以看到原本的設定檔 *.conf 同樣的目錄底下會自動產生一個名為 *-le-ssl.conf 檔案,其中的內容會是你原本的 HTTP 設定再加上 SSL 憑證設定,方便我們在 service apache2 restart 之後可以直接生效。範例如下:
< VirtualHost *:443> ServerAdmin master@domain.com ServerName domain.com ServerAlias www.domain.com DocumentRoot /var/www/html < Directory "/var/www/html"> AllowOverride All < /Directory> SSLCertificateFile /etc/letsencrypt/live/domain.com/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/domain.com/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateChainFile /etc/letsencrypt/live/domain.com/chain.pem < /VirtualHost> < /IfModule>
之後記得重新啟用 Apache,如下:
sudo service apache2 restart
這樣就可以了,但如果你的 SSL Module 無法正確被識別,造成 SSL 設定檔沒有被載入,那可以把前後的
為了讓所有連線都走 SSL 連線,原本的設定檔可以改成 Redirect SSL,如下:
< VirtualHost *:80> ServerAdmin master@domain.com ServerName domain.com ServerAlias www.domain.com Redirect 301 / https://domain.com/ < /VirtualHost>
前面有提到,Let’s Encrypt SSL 憑證只有 90 天的期限,如果每三個月都要搞一次也太累了,所以 auto renew 是必要的功能。要啟動 Auto Renew 也很間單,Renew 命令如下:
sudo /usr/share/letsencrypt/letsencrypt-auto renew
所以做一個排程 Script 即可,如下:
sudo vim /etc/cron.daily/letsencrypt-renew
#!/bin/bash
/usr/share/letsencrypt/letsencrypt-auto renew > /var/log/letsencrypt-auto.log
Let’s Encrypt