前言
打了幾篇文章之後發現,要想前言真的是一件挺燒腦的事情,明明也不是特別為了什麼才寫文章
單純地只是為了把工作上遇到困難的解決辦法,記錄在這裡所以才打開hexo
(攤手
而因為最近部署了越來越多次的Server,導致我也面臨各種申請SSL/TLS的需求
因此我把這一塊拉出來寫成一篇文章,好讓我以後再架設不同Web Server時也能快速上手
那一樣就直接開始吧~
在開始之前
有幾個名詞可以簡單介紹一下
Let’s Encrypt: 免費、自動化和開放的憑證(SSL/TLS)頒發機構
Certbot: 協助向
Let’s Encrypt
申請憑證(SSL/TLS)的開源軟體
更多的相關知識你可以在網路上找到不少專業文章,這裡就只單純記錄實作上需要用到的部分
但在操作以下步驟之前,你必須先符合以下條件:
- 已先向域名商(Web hosts)註冊一組網域名稱
- 已設定
DNS
指向該Server IP - 已在
Apache
/Nginx
設定檔中新增域名至ServerName
中
環境
接著我們可以先根據PPA
下載最新版本的Certobt
1 | sudo add-apt-repository ppa:certbot/certbot |
按照提示按下
Enter
申請SSL/TLS憑證
這裡先採用Apache
作為實作範例,其實只要理解操作,要更換為Nginx
並不會太困難
建立SSL憑證
1 | sudo certbot --apache -d <YOUR_DOMAIN> -d <YOUR_DOMAIN2> |
–apache: 使用Apache Web Server / -d: domain(可以依照域名新增至好幾個)
如果不想讓
Certbot
覆寫設定檔只產生憑證,可以加入certonly
參數
如果是第一次申請,將會出現輸入Email的提示,之後Cerbot
就會向Let's Encrypt
進行申請SSL動作
同時驗證DNS配置是否正確,如果成功,Cerbot
會再問你要如何設置HTTPS
:
1 | Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. |
如果你想要讓瀏覽器輸入http://<DOMAIN>/
時自動導向https://<DOMAIN>
就輸入2
接著Certbot
就會在/etc/apache2/sites-available/
中,將含有你輸入DOMAIN的設定檔進行配置,若你原先的設定內只有http<VirtualHost *:80>
,那麼Certbot
還會幫你再新增一份https<VirtualHost *:443>
的設定檔,聽起來很難以理解對吧,實際做過一遍會更清楚這其中的流程
<YOUR CONF>.conf
1
2
3
4
5
6
7<VirtualHost *:80>
...
RewriteEngine on
RewriteCond %{SERVER_NAME} =<YOUR_DOMAIN2> [OR]
RewriteCond %{SERVER_NAME} =<YOUR_DOMAIN>
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost><YOUR CONF>-le-ssl.conf
1
2
3
4
5
6
7
8<IfModule mod_ssl.c>
<VirtualHost *:443>
...
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/kiitzu.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/kiitzu.com/privkey.pem
</VirtualHost>
</IfModule>
若是Aapche記得要手動開啟SSL
1 | sudo a2enmod ssl |
到這裡我們的憑證就已經申請好了,我們重啟Apache
1 | sudo service apache2 reload |
現在你可以打開瀏覽器輸入https://<YOUR_DOMAIN>
就可以看到SSL囉~
更換SSL/TLS憑證
值得注意的是,Let’s Encrypt
憑證是只有三個月的效期的,你可以手動查看目前申請的憑證狀態
1 | sudo certbot certificates |
如果你想更換憑證可以這麼做
1 | sudo certbot renew -v |
但這樣做太不人性化了,等於每三個月都還要手動更換,因此推薦用Corntab的方式幫我們每個禮拜去確認憑證狀態,如果效期低於一個月就會自動更換憑證
1 | sudo certbot renew --dry-run |
確認Corntab狀態
1 | sudo systemctl status certbot.timer |
而想要移除憑證可以這麼做
1 | sudo certbot delete |
可以加入
--cert-name <DOMAIN>
參數直接根據域名刪除
Django
若你的專案正好是Django,那有一個地方要特別注意
再申請SSL之前,我們必須先把.conf
裡有關WSGI的配置全部拿掉
1 | WSGIDaemonProcess core python-path=/var/app/<YOR PROJECT> python-home=/var/app/<YOR PROJECT>/.venv |
然後申請完後再把這些配置加回置<YOUR CONF>-le-ssl.conf
裡
這麼做的目的是為了避免WSGI配置放在<YOUR CONF>.conf
而導致的衝突發生