免費 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 簽發關係圖:
申請 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 設定檔,你就會看到以下畫面:
直接選擇「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 [email protected] 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 [email protected] 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