为你的nginx docker配置自动Let' Eencrypt认证

dfbe7dca71d0e694567b7389209e0ba.jpg

为你的nginx docker配置自动Let' Eencrypt认证

这是前一篇配置 Nginx Docker 的后续内容,在这一片博客当中,会记录如何使用Let' Eencrypt给予网站https认证,以及自动更新脚本。

获取免费证书

  1. 安装Certbot客户端

    apt install certbot
    
  2. 获取证书

    certbot certonly --standalone -d example.com -d www.example.com
    

    **我们的一些服务并没有根目录,例如一些微服务,这时候使用 **--webroot 就走不通了。certbot 还有另外一种模式 --standalone , 这种模式不需要指定网站根目录,他会自动启用服务器的443端口,来验证域名的归属。我们有其他服务(例如nginx)占用了443端口,就必须先停止这些服务,在证书生成完毕后,再启用。

证书生成完毕后,我们可以在 /etc/letsencrypt/live/ 目录下看到对应域名的文件夹,里面存放了指向证书的一些快捷方式。但我们使用 Nginx docker 的时候,我们需要将源文件拷贝到容器的映射目录,源文件目录为/etc/letsencrypt/archive/

cp -r /etc/letsencrypt/archive/* /nginx/cert/

Nginx配置文件

在配置文件中添加Server内容如下:

server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name  .atoposlibra.top;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_session_tickets off;
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:10m;
        add_header Strict-Transport-Security
            "max-age=31536000; includeSubDomains"
            always;
        ssl_certificate /cert/你的网站域名/fullchain1.pem;
        ssl_certificate_key /cert/你的网站域名/privkey1.pem; 
        location / {
            proxy_pass http://127.0.0.1:你的网站端口;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto https;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    }

自动更新 SSL 证书

Let' Eencrypt的认证只有90天的有效期,所以我们至少需要每隔90天就要进行一次认证,否则会导致https认证失效。

在Ubuntu上创建这样一个脚本,我们可以选择Shell脚本来实现,因为它可以直接运行终端命令。下面是一个基本的脚本示例,该脚本会停止Docker容器中的Nginx服务,更新Let's Encrypt证书,将新证书复制到指定位置,然后重启Nginx的Docker容器。此脚本使用了certbot来更新Let's Encrypt证书,这是一个常用的工具来自动化管理Let's Encrypt证书。

#!/bin/bash
​
# 定义你的Nginx Docker容器名
NGINX_CONTAINER_NAME="nginx-container"
​
# 定义证书复制的目标路径
CERT_DESTINATION_PATH="/nginx/cert"
​
# 停止Nginx容器
docker stop $NGINX_CONTAINER_NAME
​
# 更新Let's Encrypt证书
# 假设你的域名是example.com
certbot renew --standalone --preferred-challenges http
​
# 检查certbot命令是否成功执行
if [ $? -ne 0 ]; then
    echo "Certbot renewal failed."
    exit 1
fi
​
# 将新证书复制到容器映射文件夹
cp -r /etc/letsencrypt/archive/* $CERT_DESTINATION_PATH/
​
# 重启Nginx容器
docker start $NGINX_CONTAINER_NAME

将此脚本保存为一个文件,例如update_nginx_cert.sh,然后赋予它执行权限:

chmod +x update_nginx_cert.sh

要每两个月自动运行这个脚本,你可以使用cron来安排它。打开当前用户的crontab文件:

crontab -e

然后添加以下行来安排任务。这行命令意味着每两个月的第一天的午夜12点执行脚本:

0 0 1 */2 * /path/to/your/script/update_nginx_cert.sh

请确保替换/path/to/your/script/update_nginx_cert.sh为你脚本的实际路径。这样,你的系统就会每两个月自动更新Let's Encrypt证书,并且相应地更新你的Nginx Docker容器了。


标题:为你的nginx docker配置自动Let' Eencrypt认证
作者:chen
地址:http://blog.chen.szkxy.net/blog/articles/2024/02/29/1709193633143.html

    评论
    0 评论
avatar

取消