如何申請免費 SSL 憑證 (在 Windows 環境下)
因為有開發一些 Windows 平台下的程式,有部分需要做整合並透過 server 來串接,所以把 linux 平台下的網站搬到 Windows 來。以往只是內部測試用,並不是很在意加密問題,但現在要把網頁發佈出來,就難免要牽涉到申請憑證問題。目前 DNS 託管是在 中華電信的 hinet,因有架設多個網站,目前有設定多個 DNS 紀錄,而環境的部組合定為:
Nginx + Waitress + Django + PostgreSQL
由於 Django 自帶的 server 是屬於開發用,效能較差,並不適合正式上線, 所以選用了 Waitres。至於是用 Nginx 而非 Apache 主要也是效能考量,而且現在我有多個網域,在設定上,使用 Nginx 非常方便。Apache 單單是 mod_wsgi 版本的選用就會耗掉不少時間。
在上線後,接下來就是申請SSL 的問題。網路上查到 Let's Encrypt 有提供免費的憑證,雖然每隔三個月就要更新一次,但仍有自動更新的工具可用,整體來說十分方便。
這裡採用 Certbot 這個工具來申請 SSL。首先從 https://dl.eff.org/certbot-beta-installer-win_amd64.exe 網址下載安裝程式 ( 其中 https://certbot.eff.org/instructions?ws=nginx&os=windows 這裡有完整的使用說明)。在安裝後,直接進入命令視窗。首先按 視窗鍵 + X,視窗會彈出下面視窗,接下來按紅色選項,以視窗管理者身分執行 command。
Certbot 會基於 ACME 標準,提供 DNS-01 及 HTTP-01 兩種驗證方式來申請 SSL。以下簡略說明一下原理:
1. DNS-01 驗證:在託管 (或自己架站的) DNS 網域中,有 A, MX, TXT, AAAA... 等多項紀錄可以設定。Certbot 會要求在
_acme-challenge.<自己的主網域>
這段網域的 TXT 紀錄中,放入特定文字,以此來證明自己對此網域有控制權。此方式可以一次驗證多個網站,但須對網域設訂有一定的了解。
2. HTTP-01 驗證:在 Certbot 會要求在 <自己的網域名>/.well-known/acme-challenge/<TOKEN> 底下方一個檔案,此檔案須包含 Certbot 所要求的特
定內容。此後 ACME 會透過 80 port 嘗試在 url <自己的網址>/.well-known/acme-challenge/<TOKEN> 下取得檔案來驗證申請者是否對 web server
有控制權。
我這裡使用 DNS-01 驗證,在 Command 視窗中輸入:
certbot certonly --manual -m <email> -d <自己的網域名> -d *.<自己的網域名>
在這裡,要同時驗證包含 自己的網域 的所有網域,此時所發的憑證是屬於萬用憑證。實例如下:
上例,要在DNS代管列表中新增一筆紀錄,並在主機名稱填入 _acme-challenge.<自己的網域名>,然後要把 "TlbILrT_T4WUcHXJr6ovsVZTLVLjB0pA8vokoVaX7LA" (依據實際狀況放入當時的值) 這段文字放在TXT 紀錄中,詳如下圖:
之後回到 Command 視窗,先不要按下 Enter 鍵。因為 DNS 紀錄若有異動,通常會需要一段時間才會生效。此時可到
https://toolbox.googleapps.com/apps/dig/ 然後輸入自己的網域名稱,並檢查 TXT 的值,如果 TXT 欄位出現放入的設定值 (此例為 "TlbILrT_T4WUcHXJr6ovsVZTLVLjB0pA8vokoVaX7LA" 如下圖),那麼就可以在 Command 視窗下按 Enter 鍵。
之後如果成功,就會出現下列訊息告知 Certificate 跟 Key 的放置位置。
然後在 Nginx 的設定檔 nginx.conf 裡加入下面幾列並存檔:
listen 443 ssl;
ssl_certificate <Certificate檔按位置>;
ssl_certificate_key <Key檔按位置>;
修改完成後,再下命令 nginx -s reload 讓 Nginx 重新載入設定檔。這時網站就可用 https 來訪問了。