使用Let’s Encrypt實現網站https化

IT王小二發表於2021-06-30

使用 Let's Encrypt 證書和搭配 Nginx 實現網站 https 化。

一、SSL證書獲取

由於 Let's Encrypy 申請的 SSL 證書只有三個月的有效期,為了實現自動續期,使用 acme.sh 指令碼來獲取且自動續期。

使用過程中如有問題參考 acme官方文件 ,文件有中文說明,下面記錄我自己的操作。

1. 下載指令碼並安裝

下載指令碼並安裝,將郵箱設定成自己的。

wget -O -  https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh | sh -s -- --install-online -m  itwxe@qq.com

重新整理使用者變數,任意目錄可以使用 acme.sh。

source /root/.bashrc

這裡除了安裝了指令碼,同時還自動配置了個定時任務,這個定時任務每天會檢查你的證書是否需要自動續期,可以使用 crontab -l 檢視。

2. 生成證書

為了自動驗證並更新證書,使用 DNS 驗證需要往檔案新增自己的 DNS 授權碼,個人認為不太安全,這裡使用了 http 方式驗證域名所有權,此處結合了 nginx。

nginx 配置你想要申請域名的路徑,我這裡統一使用 /itwxe/blogSite/public 來驗證,如果還有不知道 nginx 怎麼安裝的可以檢視 Linux(CentOS7)下Nginx安裝

修改 nginx.conf 檔案,nginx 配置如下,修改後記得驗證 nginx -t 是否正確,nginx -s reload 重啟 nginx。

server {
        listen       80;
        server_name  www.itwxe.com img.itwxe.com;

        location / {
            root /itwxe/blogSite/public;
        }
} 

執行命令申請證書。

# www.itwxe.com SSL申請
acme.sh --issue -d www.itwxe.com -w /itwxe/blogSite/public

# img.itwxe.com SSL申請
acme.sh --issue -d img.itwxe.com -w /itwxe/blogSite/public

申請過程非常快的,列印的日誌也很簡單,成功了就會提示 sucess,有錯誤也會提示 error。

生成成功之後的檔案在 /root/.acme.sh/ 目錄下,以域名為資料夾,SSL 證書就在這個目錄下。

證書目錄

二、Nginx配置https

首先把生成的 SSL 證書複製到自己的目錄,我是在 nginx 目錄下建立了一個 ssl 目錄專門用來存放證書。

cp /root/.acme.sh/www.itwxe.com/{fullchain.cer,www.itwxe.com.key} /usr/local/nginx/ssl/www/

cp /root/.acme.sh/img.itwxe.com/{fullchain.cer,img.itwxe.com.key} /usr/local/nginx/ssl/img/

配置 https,這裡我把實現 http 重定向 https,同時 itwxe.com 重定向 www.itwxe.com ,貼出自己的部分配置。

    server {
        listen       80;
        server_name *.itwxe.com;
        # 將http請求轉變為https
        rewrite ^(.*) https://$host$1 permanent;
        charset utf-8;
    }
    
    server {
        listen 443 ssl;
        server_name itwxe.com;
        ssl_certificate /usr/local/nginx/ssl/www/fullchain.cer;
        ssl_certificate_key /usr/local/nginx/ssl/www/www.itwxe.com.key;
        return 301 https://www.itwxe.com$request_uri;
    }

    server {
        listen 443 ssl;
        server_name www.itwxe.com;
        ssl_certificate /usr/local/nginx/ssl/www/fullchain.cer;
        ssl_certificate_key /usr/local/nginx/ssl/www/www.itwxe.com.key;
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout 30m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers HIGH:!aNULL:!MD5:!EXPORT56:!EXP;
        ssl_prefer_server_ciphers on;
        proxy_connect_timeout 500;
        proxy_send_timeout 500;
        proxy_read_timeout 500;
        client_max_body_size 200m;
        location / {
            root /itwxe/blogSite/public;
            index index.html;
        }
    }

    server {
        listen 443 ssl;
        server_name img.itwxe.com;
        ssl_certificate /usr/local/nginx/ssl/img/fullchain.cer;
        ssl_certificate_key /usr/local/nginx/ssl/img/img.itwxe.com.key;
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout 30m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers HIGH:!aNULL:!MD5:!EXPORT56:!EXP;
        ssl_prefer_server_ciphers on;
        proxy_connect_timeout 500;
        proxy_send_timeout 500;
        proxy_read_timeout 500;
        client_max_body_size 200m;
        location /blog {
            root /itwxe/dockerData/minio/data;
            autoindex on;
        }
    }

驗證配置和重啟 nginx。

nginx -t

nginx -s reload

驗證之後可以看到網站小綠標已經加上了,證書檢視也可以看到確實是三個月有效期。

ssl

三、自動續期

前面說了正常情況下指令碼配置了定時任務每天都會檢查證書是否過期,超過兩個月就認為證書要過期了,重新續簽證書。

但是這種情況下並不會將重新生成的證書並不會複製到 nginx 的 ssl 目錄下,並重啟nginx,那麼就自己寫個指令碼管理,同時將定時任務修改為每 10 天的凌晨 00:28 分檢查 證書是否要過期了。

我在 /itwxe/cron/ssl/ 目錄下建立 checkSSL.sh 執行指令碼,新增下面內容。

#!/bin/bash

echo "================================開始執行時間:$(date +%Y-%m-%d\ %H:%M:%S)"

echo "================================檢查證書是否過期:"
"/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh"

echo "================================複製www證書到nginx ssl目錄"
cp -r /root/.acme.sh/www.itwxe.com/{fullchain.cer,www.itwxe.com.key} /usr/local/nginx/ssl/www/
echo "================================複製img證書到nginx ssl目錄"
cp -r /root/.acme.sh/img.itwxe.com/{fullchain.cer,img.itwxe.com.key} /usr/local/nginx/ssl/img/

echo "================================重啟nginx"
nginx -s reload

echo -e "================================結束執行時間:$(date +%Y-%m-%d\ %H:%M:%S)\n"

賦予可執行許可權。

chmod +x checkSSL.sh

crontab -e 刪除原來的定時任務,新增定時任務。

28 0 */10 * * /itwxe/cron/ssl/checkSSL.sh >> /itwxe/cron/ssl/checkSSL.log 2>&1

重啟定時任務

systemctl restart crond

當然為了檢驗效果可以,設定最近的時間進行校驗是否可以正常執行,例如設定每天18:03執行定時任務。

3 18 * * * /itwxe/cron/ssl/checkSSL.sh >> /itwxe/cron/ssl/checkSSL.log 2>&1

到這裡,就實現了網站的 https 化。

都讀到這裡了,來個 點贊、評論、關注、收藏 吧!

文章作者:IT王小二
首發地址:https://www.itwxe.com/posts/c0cb6cbc/
版權宣告:文章內容遵循 署名-非商業性使用-禁止演繹 4.0 國際 進行許可,轉載請在文章頁面明顯位置給出作者與原文連結。

相關文章