在網站上加入SSL憑證(使用Let’s Encrypt SSL)

本章目的

image

主要教學如何在Linux上透過指令加入Let’s Encrypt SSL,如果沒有SSL憑證的話,網站旁邊會出現不安全,為了讓自己的網站(看上去)更安全,就需要加入SSL憑證

Let’s Encrypt的驗證方式

客戶在申請 Let’s Encrypt 證書的時候,需要校驗域名的所有權,證明操作者有權利為該域名申請證書,目前支持三種驗證方式:

  1. dns-01:給域名添加一個 DNS TXT 記錄。
  2. http-01:在域名對應的 Web 服務器下放置一個 HTTP well-known URL 資源文件。
  3. tls-sni-01:在域名對應的 Web 服務器下放置一個 HTTPS well-known URL 資源文件。

Let’s Encrypt SSL 設定

1. 下載Certbot

certbot是專門為Let’s encrypt製作的一個管理證書工具,可以通過它來生成證書管理更新Let’s encrypt證書。它們都是免費的。

git clone https://github.com/certbot/certbot
cd certbot
./certbot-auto --help

2. 設定 ACME-Challenge

ACME Challenge 是為了要證明您具有網域控制權的一種驗證方式,主要是通過您設定一組 A/AAAA (IPv4/IPv6)紀錄指向伺服器,並在伺服器上驗證 challenge 憑證。這也是為什麼自動安裝憑證的流程需要您的網站以及網址是處於線上的狀態(DNS 指向伺服器,伺服器提供對應證明 hash)。

編輯Nginx設定檔,一般位置可能是/etc/nginx/sites-available/default 而我的Nginx配置位於 /usr/local/nginx/conf/nginx.conf,請尋找自己的Nginx設定檔

在server block裡加入以下

server
    {
    ...省略...
        ###這裡開始加入###
        location ^~ /.well-known/acme-challenge/ 
        {   
            default_type    "text/plain";
            root /home/wwwroot/default/;
        }
        ###這裡結束加入###
    ...省略...
    }

注意:沒有通過 ACME-Challenge(Automatic Certificate Management Environment) 還是可以產生憑證,只是後續無法自動產生/更新憑證。

3. 生成免費憑證

./certbot-auto certonly --webroot -w /home/wwwroot/default -d ank.pw

需要輸入email用以收信renew提醒(可不填)

/home/wwwroot/default 為目前網站目錄

ank.pw 為自己的domain

4. 獲取憑證

完成上述shell會顯示以下message:

...省略...
MPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/ank.pw/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/ank.pw/privkey.pem
   Your cert will expire on 2020-07-17. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again. To non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
...省略...

重點:

1.路徑 : /etc/letsencrypt/live/ank.pw/

2.expiry date : 2020-07-17

進入/etc/letsencrypt/live/ank.pw/ 會看到有四張憑證 分別為:

  • cert.pem
  • chain.pem
  • fullchain.pem
  • privkey.pem

5. 手動生成 dhparams

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

來用增加安全性

6. 安裝憑證 (配置 Nginx)

憑證已經取得了,接下來當然要安裝憑證,也就是設定Nginx。

我的Nginx配置位於/usr/local/nginx/conf/nginx.conf,配置如下

    ...省略...
#---這裡開始是我添加的部分---#
#---新增一個新的Server block---#
#---以把80port流量重導向---#
server{
        listen 80; 
        server_name ank.pw;
        return 301 https://ank.pw; #301為永久導向 302臨時導向
}
server
    {  
        #listen 443 ssl http2;
        listen 443;
        server_name ank.pw;

        ssl on; #這語法會出現waring,無視它
        ssl_certificate /etc/letsencrypt/live/ank.pw/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/ank.pw/privkey.pem;
        ssl_dhparam /etc/ssl/certs/dhparams.pem;
        ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers HIGH:!aNULL:!MD5;
#----這裡是我添加的結尾---#

        #listen 80 default_server reuseport; #和上面重覆,手動註解
        #listen [::]:80 default_server ipv6only=on; #手動註解
        #server_name ank.pw; #和上面重覆,手動註解
        index index.html index.htm index.php;
        root  /home/wwwroot/default; #Nginx的網站根目錄位置
    ...省略...
}

然後重啟nginx lnmp nginx restart

提醒!記得清除瀏覽器301缓存

我有幾次被瀏覽器騙了 以為成功 改用手機開又不行 以為失敗 但其實成功了沒發現

以Chrome為例:
1.自訂及管理google chrome->更多工具->清除瀏覽器數據:
2.篩選 瀏覽器記錄 及 緩存的圖片和文件,然後清除
3.按F5重新整理看看有沒有出現一個鎖

image

7. 自動更新憑證

renew 指令

sh /root/certbot/certbot-auto renew

加入到排程工作

crontab -e 
30 2 * * 1 sh /root/certbot/certbot-auto renew (逢星期一凌晨2:30執行)

不過目前似乎要等到過期後( Let’s Encrypt 憑證為90天有效期),執行這句指令才會生效,有待驗證。