[教學] 申請Let’s Encrypt憑證與啟用https (Nginx)

現在網路越來越講究資安問題了,就連google也越來越推廣大家網站使用https協定,而使用https需要使用有購買憑證,以前購買憑證一年都要不少錢,對於小網站來說買憑證的錢可能足夠租好幾個月伺服器了,而現在Let’s Encrypt為了推廣Https,而提供免費的憑證給大家使用,如果你支持它們這樣的服務,也可以在官方網站贊助他們。

※注意:假如始有使用到金流的網站或是一些重要的網站,是無法使用免費憑證的,還是需要自行購買付費的憑證

步驟一、 安裝Certbot

要跟Let’s Encrypt取得SSL憑證需先安裝Certbot在伺服器上。

在command中輸入以下指令增加certbot的repository

sudo add-apt-repository ppa:certbot/certbot

接著update一下repository的資訊 輸入

sudo apt-get update

接著輸入指令安裝Certbot

sudo apt-get install certbot

步驟二、 修改Nginx設定

因為我們會使用Webroot Plugin來取得SSL憑證,而SSL憑證會運作在特別的路徑/.well-known,所以設定nginx來讓它可以存取/.well-known

輸入以下修改nginx設定

sudo nano /etc/nginx/sites-available/default

然後要使用憑證的server block中加入:

location ~ /.well-known {
     allow all;
}

在重新啟動nginx前 輸入以下指令檢查設定檔是否沒問題

sudo nginx -t

如果有出現nginx: configuration file /etc/nginx/nginx.conf test is successful 就表示沒有問題
假如檢查沒有問題後輸入以下指令重新啟動nginx

sudo systemctl restart nginx

步驟三、 申請憑證

接下來就是重要的申請憑證了

我們要輸入相當於以下的指令來申請

其中/var/www/html可能你網頁程式資料夾設定的位置不同 要依據自己的位置修改

而後面的domain.comwww.domain.com則是使用這個路徑的domain網址 請改成自己的domain

假如有更多domain需要設定可以依此類推在後面加上-d new.domain.com

sudo certbot certonly --webroot --webroot-path=/var/www/html -d domain.com -d www.domain.com

提示會顯示Enter email address (used for urgent renewal and security notices) (Enter ‘c’ tocancel):

這時輸入自己的信箱(用於寄信通知用)

而假如不想使用信箱可以加上 –register-unsafely-without-email 類似於

sudo certbot certonly --webroot --register-unsafely-without-email --webroot-path=/var/www/html -d domain.com -d www.domain.com

會顯示以下訊息要求看一下使用條款

-------------------------------------------------------------------------------

Please read the Terms of Service at

https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree

in order to register with the ACME server at

https://acme-v01.api.letsencrypt.org/directory

-------------------------------------------------------------------------------

(A)gree/(C)ancel:

這時回答輸入A同意

接著取得憑證完成會顯示以下的訊息

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/www.domain.com/fullchain.pem. Your cert
   will expire on 2017-09-09. To obtain a new or tweaked version of
   this certificate in the future, simply run certbot again. To
   non-interactively renew *all* of your certificates, run "certbot
   renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

其中說了憑證申請完成,而憑證放的位置為/etc/letsencrypt/live/www.domain.com/fullchain.pem

而這個憑證是有時間限制的,上面寫會於2017-09-09到期 到時需要再申請新的憑證(後面有教學)

這時會發現憑證放的位置資料夾中(/etc/letsencrypt/live/www.domain.com)會有四個檔案cert.pem  chain.pem  fullchain.pem  privkey.pem

接下來為了增加安全性 我們要產生一個2048-bit Diffie-Hellman的密碼組合 輸入指令

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

他會產生在/etc/ssl/certs/dhparam.pem

 

步驟四、 Nginx設定憑證與啟動https

首先我們要在位置產生一個nginx的configuration snippets來設定SSL Key跟Certificate 輸入以下指令

sudo nano /etc/nginx/snippets/ssl-domain.com.conf

並在檔案中加上以下內容 (注意:請依照自己的實際檔案位置修改domain.com的部分)

ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;

接下來產生另一個nginx的configuration snippets來設定Strong Encryption 輸入

sudo nano /etc/nginx/snippets/ssl-params.conf

內容輸入

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
ssl_dhparam /etc/ssl/certs/dhparam.pem;

其中的8.8.8.8 8.8.4.4/etc/ssl/certs/dhparam.pem可以依據自己使用不同做設定

8.8.8.8 8.8.4.4 為Google DNS的IP 假如要使用別的DNS就改成自己使用的DNS IP

/etc/ssl/certs/dhparam.pem是剛剛產生的2048-bit Diffie-Hellman的密碼組合位置 如果你在產生時不是放在此路徑 就修改這個選項

然後要修改nginx設定 輸入指令

sudo nano /etc/nginx/sites-available/default

這邊教兩種選擇 其他情況請依據自己使用需求做設定

選擇一、只保留https 而http轉向https

先將原本server block設定中的

listen 80 default_server;
listen [::]:80 default_server;

改成

listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
include snippets/ssl-domain.com.conf;
include snippets/ssl-params.conf;

我們加上一個新的server block 讓http自動轉向https (domain請改成自己的domain)

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name domain.com www.domain.com;
    return 301 https://$server_name$request_uri;
}

選擇二、 http與https都保留

而假如想要http與https同時都存在

只需要在原本的server block加上

listen 443 ssl http2 default_server;

listen [::]:443 ssl http2 default_server;

include snippets/ssl-domain.com.conf;

include snippets/ssl-params.conf;

當設定完成後我們檢查設定是否沒有問題 輸入指令

sudo nginx -t

如果有出現nginx: configuration file /etc/nginx/nginx.conf test is successful

就表示設定正常 接著重啟nginx 輸入

sudo systemctl restart nginx

接下來可以輸入你的網址看看是否成功 並且可以在以下網址檢測你的https安全性等級
https://www.ssllabs.com/ssltest/analyze.html

步驟五、 設定自動更新憑證

因為Let’s Encrypt的憑證每過一段時間就會過期,快過期的時候只需要輸入指令certbot renew就會更新憑證,但是一直定時去輸入很花時間,而且有時可能會忘記去更新會導致瀏覽器顯示為不安全的網站,所以我們用cron job去自動更新憑證輸入以下指令開啟排程設定

sudo crontab –e

接著我們在裡面加上 如下面的一行

10 7 * * * /usr/bin/certbot renew --quiet --renew-hook "/bin/systemctl reload nginx"

便會在每天的7點10分自動去更新憑證並且重新啟動nginx

而假如位置web檔案路徑改變的話 則需要去改變設定

輸入以下指令 修改Let’s Encrypt自動更新的設定 可在裡面修改憑證位置與網站路徑位置

/etc/letsencrypt/renewal/*.conf