• 部署 Let's Encrypt 免费 SSL 证书及自动续期

    26-02-02 10:30 0 0 技术

    一、环境说明

    • 操作系统:AlmaLinux 9.7
    • Web 服务:Docker Nginx
    • 证书机构:Let’s Encrypt
    • 证书管理:acme.sh
    • 验证方式:HTTP-01
    • 证书算法:ECC P-256

    使用 acme.sh 管理 Let’s Encrypt 证书,实现自动申请、自动续期和自动部署,不需要阿里云 AccessKey,也不需要手动添加 DNS TXT 记录。

    二、Nginx 配置

    当前 Docker Compose 已经挂载:

    - ${PROJECT_FOLDER}:/var/www/html/:rw
    - ./nginx/ssl:/etc/nginx/ssl
    

    因此直接复用现有目录,不需要增加 Docker Volume。

    修改 Nginx 配置,将 HTTP 和 HTTPS 分开:

    # HTTP:证书验证及 HTTPS 跳转
    server {
        listen 80;
        server_name cuiliang.com www.cuiliang.com
                    cuiliang.com.cn www.cuiliang.com.cn;
    
        location ^~ /.well-known/acme-challenge/ {
            root /var/www/html;
            default_type text/plain;
            autoindex off;
            try_files $uri =404;
        }
    
        location / {
            return 301 https://www.cuiliang.com$request_uri;
        }
    }
    
    # HTTPS:正式业务服务
    server {
        listen 443 ssl http2;
        server_name cuiliang.com www.cuiliang.com
                    cuiliang.com.cn www.cuiliang.com.cn;
    
        if ($host != www.cuiliang.com) {
            return 301 https://www.cuiliang.com$request_uri;
        }
    
        ssl_certificate /etc/nginx/ssl/www.cuiliang.com/server.crt;
        ssl_certificate_key /etc/nginx/ssl/www.cuiliang.com/server.key;
    
        ssl_session_timeout 5m;
        ssl_protocols TLSv1.2 TLSv1.3;
    
        ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:
                    ECDHE-RSA-AES128-GCM-SHA256:
                    ECDHE-ECDSA-AES256-GCM-SHA384:
                    ECDHE-RSA-AES256-GCM-SHA384;
    
        location / {
            proxy_pass http://go:8080;
            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 $scheme;
        }
    }
    

    三、安装并申请证书

    安装 acme.sh:

    curl https://get.acme.sh | sh -s email=你的邮箱
    

    设置 Let’s Encrypt:

    ~/.acme.sh/acme.sh --set-default-ca --server letsencrypt
    

    创建验证目录:

    mkdir -p /root/www/.well-known/acme-challenge
    

    申请证书:

    ~/.acme.sh/acme.sh --issue \
      --server letsencrypt \
      --webroot /root/www \
      -d cuiliang.com \
      -d www.cuiliang.com \
      -d cuiliang.com.cn \
      -d www.cuiliang.com.cn \
      --keylength ec-256
    

    注意:所有域名都需要正确解析到服务器,公网 TCP 80 端口必须可以访问。

    四、安装证书及自动续期

    创建证书目录:

    mkdir -p /root/docker/nginx/ssl/www.cuiliang.com
    

    安装证书:

    ~/.acme.sh/acme.sh --install-cert \
      -d cuiliang.com \
      --key-file /root/docker/nginx/ssl/www.cuiliang.com/server.key \
      --fullchain-file /root/docker/nginx/ssl/www.cuiliang.com/server.crt \
      --reloadcmd "docker exec nginx nginx -t && docker exec nginx nginx -s reload"
    

    修改 HTTPS 配置后,检查并 Reload Nginx:

    docker exec nginx nginx -t
    docker exec nginx nginx -s reload
    

    自动续期

    acme.sh 安装时会自动创建 Cron 定时任务,无需手动添加。

    查看定时任务:

    crontab -l
    

    acme.sh 会定期检查证书有效期,到达续期条件后自动申请新证书、更新证书文件,并执行 Nginx Reload。

    五、常用维护命令

    # 查看证书
    ~/.acme.sh/acme.sh --list
    
    # 查看证书有效期
    openssl x509 -in /root/docker/nginx/ssl/www.cuiliang.com/server.crt -noout -dates
    
    # 检查 Nginx 配置
    docker exec nginx nginx -t
    
    # 手动 Reload Nginx
    docker exec nginx nginx -s reload
    

    至此,Let’s Encrypt 免费 SSL 证书部署完成,实现证书自动申请、自动续期和 Docker Nginx 自动加载,无需手动维护证书。