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


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

作者:IT王小二
博客:https://itwxe.com

一、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 化。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM