跳至主要內容

[linux] let's encrypt

申請 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 設定檔沒有被載入,那可以把前後的 標記移除就 OK 囉。
為了讓所有連線都走 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

分類:linux
由 Compete Themes 設計的 Author 佈景主題