Background

最近想把blog從http換到https. 想說順便練習一下怎麼換. 不然還是不會換. 但又不太想花錢. 所以只好找看看有沒有免費的可以用. 所以這篇文章主要在介紹如何把Ghost Blog從http升到https.

Let's encrypt

最後選擇的是網路上很多人推薦的 Let's encrypt. 但是 Let's Encrypt 需要每隔90天要重新取得一次憑證. 所以你還需要 Certbot 的協助. 那基本上 Let's Encrypt 的官網也是推薦用 Certbot 來自動在機器上取得SSL憑證.

Certbot

Certbot 是一個open source在Github上. 也有一個官方網站上面有介紹怎麼在不同的環境安裝.

PIP

那安裝 Certbot 時, 是需要Python相關的環境. 所以必須要先安裝 pip.

安裝好了之後就可以來準備安裝 Certbot 的前置作業了.

$ sudo apt-get install libffi-dev libssl-dev
$ pip install pyopenssl ndg-httpsclient pyasn1
$ pip install pyOpenSSL cryptography certifi

那如果你是在DigitalOcean租VM的話那可能還會遇到一些其他問題. 這邊有相關的討論串&解決方案.

Installation

安裝好了之後就可以照 Certbot 官網的步驟進行安裝. 建議是安裝前先把你的 Nginx 停掉. 我是下載 Cerbot 後再打下面這行指令 基本上就ok了.

$ ./certbot-auto certonly --standalone --email [email protected] -d example.com

成功後會看到下面類似的訊息.

Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/blog.taiker.space/fullchain.pem.

Nginx

接下來必須要調整你的Nginx相關的conf. 以ghost為例:

$ sudo vim /etc/nginx/sites-available/ghost.conf

ghost.conf

server {
     listen 80;
+    listen 443 ssl;
     server_name example.com;
+    ssl_certificate        /etc/nginx/ssl/server.crt;
+    ssl_certificate_key    /etc/nginx/ssl/server.key;
     ...
     location / {
+       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+       proxy_set_header Host $http_host;
+       proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://127.0.0.1:2368;
        ...
     }
 }

結束後就重啟Nginx

$ sudo service nginx restart

如果要強制網站走https, 那就再修改/var/www/ghost/config.js. 把URL的http改成https.

config.js

config = {  
  production: {
    url: 'https://blog.gary-lai.com',
    ...
  },
  ...
}

然後再重啟你的ghost.

$ cd /var/www/ghost/
$ forever restart index.js

Renew Certification

$ ./certbot-auto renew --dry-run
# If dry run shows successful, then run the following commnad
$ ./certbot-auto renew

Reference