[Linux] 為 Apache/Nginx 使用 Let’s Encrypt SSL 憑證


目錄

近年來有許多組織積極推廣連線加密

特別是用在Http上的SSL

像是Let's Encrypt就是其中的免費方案之一

漸漸的受到歡迎

但是其驗證方式有點麻煩

所以透過dehydrated套件的幫助

來降低我們的使用門檻

此方法適用在Ubuntu系列及RedHat/CentOS系列

 

安裝時會需要用到Curl

所以先進行安裝

Ubuntu:

apt-get install curl

RedHat/CentOS:

yum install curl

 

下載新的執行檔

curl -LO https://github.com/lukas2511/dehydrated/archive/v0.3.1.tar.gz

tar -zxv -f v0.3.1.tar.gz

cd dehydrated-0.3.1/

 

將檔案移至/etc/dehydrated/並啟用執行權限來完成安裝

mkdir /etc/dehydrated/

cp ~/dehydrated/dehydrated /etc/dehydrated/

chmod a+x /etc/dehydrated/dehydrated

(這其實也不是什麼安裝啦~如果要將執行檔放在家目錄或是/var下執行也是可以的,下載的綁案就是可執行的,只是因為還沒給執行權限,所以利用chmod給執行權限而已)

 

建立 SSL certificate 證驗證過程時所需要的目錄

mkdir -p /var/www/dehydrated/

(若要放別的地方也行,只要記得給apache執行權限即可)

 

在要認證的 virtual host 裡用別名的方式加上剛剛建立的資料夾路徑

Apache:

Alias /.well-known/acme-challenge/ /var/www/dehydrated/

Nginx:

location /.well-known/acme-challenge/ {

alias /var/www/dehydrated/;

}

 

第一次產生 SSL certificate,紅色的部份請代換成網域名稱

/etc/dehydrated/dehydrated -c -d lchick.idv.tw

 

成功的話會有類似的輸出

Processing lchick.idv.tw

+ Signing domains...

+ Generating private key...

+ Generating signing request...

+ Requesting challenge for lchick.idv.tw...

+ Responding to challenge for lchick.idv.tw...

+ Challenge is valid!

+ Requesting certificate...

+ Checking certificate...

+ Done!

+ Creating fullchain.pem...

+ Done!

 

成功後產生的檔案都在 /etc/dehydrated/certs/lchick.idv.tw/ 裡

drwx------ 2 root root 4096 Feb 24 02:25 .

drwx------ 3 root root 4096 Feb 24 02:23 ..

-rw------- 1 root root 1651 Feb 24 02:25 cert-1456280700.csr

-rw------- 1 root root 2143 Feb 24 02:25 cert-1456280700.pem

lrwxrwxrwx 1 root root 19 Feb 24 02:25 cert.csr -> cert-1456280700.csr

lrwxrwxrwx 1 root root 19 Feb 24 02:25 cert.pem -> cert-1456280700.pem

-rw------- 1 root root 1675 Feb 24 02:25 chain-1456280700.pem

lrwxrwxrwx 1 root root 20 Feb 24 02:25 chain.pem -> chain-1456280700.pem

-rw------- 1 root root 3818 Feb 24 02:25 fullchain-1456280700.pem

lrwxrwxrwx 1 root root 24 Feb 24 02:25 fullchain.pem -> fullchain-1456280700.pem

-rw------- 1 root root 3243 Feb 24 02:25 privkey-1456280700.pem

lrwxrwxrwx 1 root root 22 Feb 24 02:25 privkey.pem -> privkey-1456280700.pem

 

接著就可以修改 Apache 或是 Nginx 的 SSL 設定

Apache:

SSLCertificateFile /etc/dehydrated/certs/lchick.idv.tw/cert.pem

SSLCertificateChainFile /etc/dehydrated/certs/lchick.idv.tw/chain.pem

SSLCertificateKeyFile /etc/dehydrated/certs/lchick.idv.tw/privkey.pem

Nginx:

ssl_certificate /etc/dehydrated/certs/lchick.idv.tw/fullchain.pem; ssl_certificate_key /etc/dehydrated/certs/lchick.idv.tw/privkey.pem;

(一樣也是加在剛剛要加密的virtual host裡面)

 

重新啟動 Apache 或是 Nginx即完成設定

Apache:

service apache2 restart (For Ubuntu)

service httpd restart (For CentOS6-)

systemctl restart httpd (For CentOS7)

Nginx:

service nginx restart (For Ubuntu)

service nginx restart (For CentOS6-)

systemctl restart nginx (For CentOS7)

 

設定crontab排成每天自動檢查憑證有效期並更新

Apache:

0 0 * * * root sleep $(expr $(printf "\%d" "0x$(hostname | md5sum | cut -c 1-8)") \% 86400); ( /etc/dehydrated/dehydrated -c -d lchick.idv.tw; /usr/sbin/service apache2 reload ) > /tmp/dehydrated-lchick.idv.tw.log 2>&1

Nginx:

0 0 * * * root sleep $(expr $(printf "\%d" "0x$(hostname | md5sum | cut -c 1-8)") \% 86400); ( /etc/dehydrated/dehydrated -c -d lchick.idv.tw; /usr/sbin/service nginx reload ) > /tmp/dehydrated-lchick.idv.tw.log 2>&1

(在 crontab 裡面每天執行是因為 dehydrated 會自己檢查憑證有效期限,如果還有一個月以上的時間有效就不會更新;另外,"sleep $(expr $(printf "\%d" "0x$(hostname | md5sum | cut -c 1-8)") \% 86400)"是利用機器名稱產生出十六進位 hash 值,抓一部分轉成十進位後除以一天的秒數,得到餘數後先停這個秒數再跑dehydrated,這樣可以避免同時間有太多機器到 Let's Encrypt 的伺服器,造成類似 DDoS 的攻擊。)

Leave a comment

你的電子郵件位址並不會被公開。 必要欄位標記為 *