Ricky 叩叮俱樂部

在開始之前,先來杯長島冰茶吧~

0%

Ubuntu 18.04 LTS+Certbot(Let’s Encrypt)

前言

打了幾篇文章之後發現,要想前言真的是一件挺燒腦的事情,明明也不是特別為了什麼才寫文章

單純地只是為了把工作上遇到困難的解決辦法,記錄在這裡所以才打開hexo(攤手

而因為最近部署了越來越多次的Server,導致我也面臨各種申請SSL/TLS的需求

因此我把這一塊拉出來寫成一篇文章,好讓我以後再架設不同Web Server時也能快速上手

那一樣就直接開始吧~

在開始之前

有幾個名詞可以簡單介紹一下

  • Let’s Encrypt: 免費、自動化和開放的憑證(SSL/TLS)頒發機構

  • Certbot: 協助向Let’s Encrypt申請憑證(SSL/TLS)的開源軟體

更多的相關知識你可以在網路上找到不少專業文章,這裡就只單純記錄實作上需要用到的部分
但在操作以下步驟之前,你必須先符合以下條件:

  1. 已先向域名商(Web hosts)註冊一組網域名稱
  2. 已設定DNS指向該Server IP
  3. 已在Apache/Nginx設定檔中新增域名至ServerName

環境

接著我們可以先根據PPA下載最新版本的Certobt

1
2
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt install python-certbot-apache

按照提示按下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
2
3
4
5
6
7
8
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

如果你想要讓瀏覽器輸入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
2
3
4
WSGIDaemonProcess core python-path=/var/app/<YOR PROJECT> python-home=/var/app/<YOR PROJECT>/.venv
WSGIProcessGroup core
WSGIScriptAlias / /var/app/<YOR PROJECT>/core/wsgi.py
WSGIPassAuthorization On

然後申請完後再把這些配置加回置<YOUR CONF>-le-ssl.conf
這麼做的目的是為了避免WSGI配置放在<YOUR CONF>.conf而導致的衝突發生