fbpx

佛心來了,快用 Let's Encrypt 免費 SSL 憑證幫網站加密吧!

let's-encrypt

免費 SSL 憑證

您是不是也跟我一樣買不起貴鬆鬆的 SSL 憑證 (其實 NameCheap 有便宜的)!?或者您的事業正在起步,能省就省!SSL 連線加密可以讓你的網站提供給使用者更高的安全性,SEO 的排名聽說也會比較前面,網址列多了「綠色鎖」感覺專業多了,這樣才夠潮。免費的 SSL 憑證其實早就有了,像是 StartSSL, 大陸的 WoSign (沃通), CloudFlare 也有提供免費的 SSL,原本我也是用 CloudFlare SSL Cerification 但是在 WindowsXP 的 Chrome 瀏覽器並不支援,會顯示「ERR_SSL_VERSION_OR_CIPHER_MISMATCH」,實在太不方便了,畢竟 WindowsXP 的使用者還是存在,聽說升級專業版之後可以解決,但我也沒打算付錢升級,所以才轉向 Let's Encrypt。StartSSL 期限是一年,申請過程很複雜,如果一樣要申請好幾個網域,要花上不少時間。大陸的沃通我就沒有註冊過了,2015 年 Let's Encrypt 就要放話在 2016 年要提供免費的 SSL 憑證,2016 年果然兌現,真是不錯。以下是 Let's Encrypt Root CA 簽發關係圖:

isrg-keys

申請 Let’s Encrypt SSL 憑證

申請 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 服務

首先你的 Apache 可以先裝上 SSL Module,接著執行以下命令:

cd /usr/share/letsencrypt

sudo ./letsencrypt-auto --apache -d domain.com

參數 -d 表示指定要安裝的網頁服務 Domain Name,加上 --apache 將會自動搜尋系統中的 Apache 設定檔 (當然也提供 Nginx, Haproxy 等等常用的網頁伺服器),自動找出 Virtual Host 設定檔自動加上 SSL 連線設定,注意喔:letsencrypt-auto 程式會搜尋單一個設定檔,你的設定檔必須只包含一個 VirtualHost 設定才行,不然程式無法正確判斷。如果有找到對應的 HTTP Virtual Hots 設定檔,你就會看到以下畫面:

letsencrypt-auto

直接選擇「Easy」模式進行安裝即可,安裝的過程 Let's Encrypt Server 會嘗試對 Domain HTTP 進行連線,確保這個程式是在您所擁有的機器上被執行,確認您是伺服器管理者後才會簽發憑證,所以一定要用 Root 執行是有原因的。一般的驗證方式會檢查 HTTP Server 上的 .well-known 資料夾裡頭的檔案,驗證程式會自動產生驗證檔案,好確認你真的是這個 Domain 的 Server Master。

安裝完之後我們可以看到原本的設定檔 *.conf 同樣的目錄底下會自動產生一個名為 *-le-ssl.conf 檔案,其中的內容會是你原本的 HTTP 設定再加上 SSL 憑證設定,方便我們在 service apache2 restart 之後可以直接生效。範例如下:

<IfModule mod_ssl.c>
<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 設定檔沒有被載入,那可以把前後的 <IfModule mod_ssl.c> 標記移除就 OK 囉。

為了讓所有連線都走 SSL 連線,原本的設定檔可以改成 Redirect SSL,如下:

<VirtualHost *:80>
    ServerAdmin master@domain.com
    ServerName domain.com
    ServerAlias www.domain.com
    Redirect 301 / https://domain.com/
</VirtualHost>

這樣一來連上 HTTP 80 的未加密連線就會自動轉為 SSL 加密連線囉。

萬用 HTTP Server 的認證方式

如果使用的 HTTP Server 不是 Let's encrypt 內建的 Apache, Nginx Plugin 可以自動完成,那可以使用 --webroot 直接指定 Document Root 來驗證,如下:

sudo ./letsencrypt-auto certonly --webroot -d domain.com

自動 Renew SSL 憑證

前面有提到,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

設定可執行

sudo chmod +x /etc/cron.daily/letsencrypt-renew

這樣每天都會檢查一次,只要有透過上述的方法安裝的憑證,都會自動每天檢查,方便吧!

筆記:Let's Encrypt Ubuntu Server 14.04 PPA 安裝

sudo echo 'deb http://ppa.launchpad.net/certbot/certbot/ubuntu trusty main ' > /etc/apt/sources.list.d/letsencrypt.list
sudo echo 'deb-src http://ppa.launchpad.net/certbot/certbot/ubuntu trusty main ' >> /etc/apt/sources.list.d/letsencrypt.list
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 75BCA694
sudo apt-get -y update
sudo apt-get -y install certbot