我們可以透過以下兩個網站申請免費的 SSL 憑證:
- Let′s encrypt: 是一個提供免費 SSL 服務的網站,可以手動申請 SSL 憑證,也可以串接它的 API,讓申請憑證的流程自動化,詳細的內容可以參考官方網站。
- CloudFlare: 主要提供 CDN 的服務,多了一層的代理,可以保護網站受到攻擊,同時也能提升網站效能,另外 CloudFlare 也有提供免費的 SSL 服務。
前置作業
在申請 SSL 憑證之前,需要先有自己的 domain,如果是使用 Heroku 的話,他預設有提供免費的 domain: <app_name>.herokuapp.com
,如果服務是在其他地方的話,網路上也有很多地方有提供免費申請網域的網站(例如: freenom、No-IP),或是也可以付費購買自己喜歡的 domain.
不過要注意的是:如果是想要申請 CloudFlare 的 SSL 憑證,domain 不能是以下幾個:
- example.tumblr.com
- example.appspot.com
- example.wordpress.com
- example.weebly.com
- example.herokuapp.com
- example.webs.com
- example.blogspot.com
- example.webs.com
- example.ning.com
- example.no-ip.com
詳細的說明可以參考: What does “ERROR Unfortunately, you can not add that domain to Cloudflare” mean?
這裡就預設我們已經有自己的 domain 了,接下來主要記錄如何申請 Let′s encrypt 的 SSL 憑證並搭配 Nginx 做設定。
我們的執行環境是 Ubuntu 16.04,搭配 Nginx 做設定,如果是要搭配 Apache 或是其他 Web server,取得憑證的步驟會不太一樣,可以參考官方網站.
安裝 Nginx
首先,需要先安裝 Nginx,可以選擇使用 apt-get
來安裝,或是自行編譯:
使用 apt-get 安裝
1 | sudo apt-get update |
啟動 Nginx:
1 | sudo nginx -c /etc/nginx/nginx.conf |
自行編譯 Nginx
下載 Nginx:
1 | wget http://nginx.org/download/nginx-1.18.0.tar.gz |
安裝 with-http_ssl_module 所需要的 OpenSSL Library:
1 | sudo apt-get install -y openssl openssl-devel |
加上 SSL Module:
1 | # 進入 NGINX 原始碼目錄 |
啟動 Nginx:
1 | home/<user>/nginx/sbin/nginx -c home/<user>/nginx/nginx.conf |
安裝 certbot
1 | sudo add-apt-repository ppa:certbot/certbot # 載入 certbot 的 ppa |
設定 Nginx
1 | # file: /etc/nginx/nginx.conf |
1 | # file: /etc/nginx/sites-available/web-ssl.conf |
Create link to /etc/nginx/sites-available/web-ssl.conf
:
1 | cd /etc/nginx/sites-enabled |
Reload Nginx:
1 | sudo nginx -s reload |
申請 Let′s encrypt SSL 憑證
以上前置作業都完成後,就可以來申請憑證:
1 | sudo certbot --nginx -d mydomain.com |
接著可以選擇要不要自動轉址:
1 | Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. |
如果還沒設定 http 自動轉 https 可以選 2.
最後出現以下訊息就是完成了:
1 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
檢查 config 是否有被自動添加內容
檢查 Nginx config 是否有被自動增加 listen 443 及憑證:
1 | listen 443 ssl; # managed by Certbot |
如果申請憑證時有選擇自動轉址,再檢查以下內容是否有被設定:
1 | if ($host = mydomain.com) { |
如果沒有選擇自動轉址,也可以自行設定:
1 | # file: /etc/nginx/site-available/default-http-to-https.conf |
重啟 Nginx
確認完後,只要再重啟 Nginx, 就可以囉!
1 | sudo nginx -s stop |
最後就可以測試看看 https://mydomain.com 是否可以使用~
更新憑證
要注意的是,Let’s encrypt 憑證的有效期限只有 90 天,可以使用以下指令更新憑證:
1 | # --dry-run: For testing |
也可以透過排程設定自動更新憑證:
1 | sudo crontab -e |
加上以下內容即可:
1 | SHELL=/bin/sh |