内容目录

安装

sudo yum install certbot

确认安装

certbot --version

申请证书

sudo certbot certonly \
    --webroot --webroot-path=/usr/share/nginx/html \
    --agree-tos --email 527993075@qq.com \
    -d iot.wivstn.com -d iotapi.wivstn.com -d dataview.wivstn.com \
    --cert-name iot.wivstn.com \
    --key-type ecdsa

检查续签任务

sudo crontab -l

编辑续签任务

sudo crontab -e

添加如下内容

0 */12 * * * /usr/bin/certbot renew --quiet
如果使用 vim 编辑器,按 Esc 键,输入 :wq 并按 Enter 保存并退出。

检查已有证书文件

certbot certificates

新增脚本,用于自动重启nginx

/etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh

内容:

#!/bin/bash
sudo systemctl reload nginx

授予权限

sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh

手动测试

sudo certbot renew --dry-run

并使用以下命令确保 cron 服务在系统启动时自动启动:

sudo systemctl enable crond

配置nginx

1. 要检查这2个地方:

nginx配置优先级是先来的优先。如果nginx.conf 先 include /etc/nginx/conf.d/*.conf,那后面的同名(同 server_name) server 块就直接不看了。(位置 /etc/nginx/)
file
file

2. 添加这部分内容:

用于让 Certbot 可以通过访问你网站的xxx/.well-known/acme-challenge/xxx这个地址 来确认域名的所有权是你。

    location ~ /.well-known/acme-challenge/ {
        allow all;
        root /usr/share/nginx/html;  # 确保这是 Certbot 配置的 webroot 路径
        try_files $uri =404;  # 直接尝试返回请求的文件,如果不存在则返回404
    }

file

重启nginx

sudo nginx -s reload


下面内容已过期,留作备份 2024年8月26日

拉取certbot镜像

docker pull certbot/certbot

运行 Certbot 容器获取证书

docker run -it --rm --name certbot \
    -v "/etc/letsencrypt:/etc/letsencrypt" \
    -v "/usr/share/nginx/html:/usr/share/nginx/html" \
    -v "/var/log/letsencrypt:/var/log/letsencrypt" \
    certbot/certbot certonly \
    --webroot --webroot-path=/usr/share/nginx/html \
    --agree-tos --email 527993075@qq.com \
    -d chenglai.net -d www.chenglai.net -d blog.chenglai.net

file

再次修改nginx配置,添加https块,并把原有http转发给https

server {
    listen 80;
    server_name blog.chenglai.net chenglai.net www.chenglai.net;

    location ~ /.well-known/acme-challenge/ {
        allow all;
        root /usr/share/nginx/html;  # 确保这是 Certbot 配置的 webroot 路径
        try_files $uri =404;  # 直接尝试返回请求的文件,如果不存在则返回404
    }

    # Redirect all HTTP requests to HTTPS
    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl;
    server_name blog.chenglai.net chenglai.net www.chenglai.net;

    ssl_certificate /etc/letsencrypt/live/chenglai.net/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/chenglai.net/privkey.pem;

    # SSL configurations
    ssl_session_cache shared:le_nginx_SSL:10m;
    ssl_session_timeout 10m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://localhost:8080;  # Assuming WordPress is accessible on port 8080 on the host
        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;
    }
}

再次重启nginx

sudo nginx -s reload

开启阿里云安全组443端口

file

完成

file

自动续签

设置 Certbot 的自动续签是确保你的 SSL 证书持续有效的重要步骤。Certbot 通常在安装时就配置了自动续签,但我们可以检查并确保它正确设置。这通常通过设置 cron 任务或使用 systemd 定时器实现。

检查 crontab

执行以下命令查看当前用户的 crontab 设置:
sudo crontab -l
file

打开编辑器:

在命令行中输入 crontab -e 并按回车。

进入插入模式:

按下 i 键进入编辑模式。

添加任务:

输入你的计划任务,例如:

0 */12 * * * certbot renew --quiet

保存和退出:

按下 Esc 键退出编辑模式。
输入 :wq(表示写入并退出)或者 :x(同样是写入并退出)。
按下 Enter 完成操作。
file

再次检查,完成

sudo crontab -l
file

确保生效,执行一次干运行测试(dry run)

sudo certbot renew --dry-run

这将模拟续订过程,但不会实际更换任何证书。如果此命令执行时没有错误,那么你的自动续签设置就很可能能在需要时正确工作。

成功:

file

失败:

file

监控续签日志:

虽然你使用了 --quiet 选项,但 Certbot 仍会在 /var/log/letsencrypt/ 目录下生成日志文件。定期检查这些日志文件可以帮助你了解续签是否按计划进行:

sudo less /var/log/letsencrypt/letsencrypt.log

检查证书有效期:

你也可以检查你的证书的当前状态和过期时间,以确保它们被成功续订。你可以使用以下命令检查证书详情:

sudo certbot certificates

这将列出所有由 Certbot 管理的证书及其详细信息,包括域名、过期日期等。

其他

统一由nginx来处理加密,而非转发443端口给到每个docker容器

Nginx 作为反向代理,可以处理外部的 HTTPS 请求,解密这些请求,然后以 HTTP 的形式将请求转发到后端的容器。这种设置中,Nginx 负责所有的加密和解密工作,而容器只处理未加密的 HTTP 流量。

/usr/share/nginx/html 确认身份文件存放处

会创建一个隐藏文件夹,里面的文件也是执行完就没有了
file

sudo chmod -R 777 /usr/share/nginx/html 开启最高权限

经过实际测试,应该是不需要的

sudo nginx -s reload 重启nginx

常用

/etc/nginx/nginx.conf 默认nginx配置

/etc/nginx/conf.d/chenglai.net.conf 每个站点的配置

http的nginx配置备份

server {
    listen 80;
    server_name blog.chenglai.net chenglai.net www.chenglai.net;

    location ~ /.well-known/acme-challenge/ {
        allow all;
        root /usr/share/nginx/html;  # 确保这是 Certbot 配置的 webroot 路径
        try_files $uri =404;  # 直接尝试返回请求的文件,如果不存在则返回404
    }

    location / {
        proxy_pass http://localhost:8080;  # WordPress 容器的宿主机端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}

最终nginx配置

server {
    listen 80;
    server_name blog.chenglai.net chenglai.net www.chenglai.net;

    location ~ /.well-known/acme-challenge/ {
        allow all;
        root /usr/share/nginx/html;  # 确保这是 Certbot 配置的 webroot 路径
        try_files $uri =404;  # 直接尝试返回请求的文件,如果不存在则返回404
    }

    # Redirect all HTTP requests to HTTPS
    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl;
    server_name blog.chenglai.net chenglai.net www.chenglai.net;

    ssl_certificate /etc/letsencrypt/live/chenglai.net/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/chenglai.net/privkey.pem;

    # SSL configurations
    ssl_session_cache shared:le_nginx_SSL:10m;
    ssl_session_timeout 10m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://localhost:8080;  # Assuming WordPress is accessible on port 8080 on the host
        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;
    }
}

故障排除 如果证书办法失败 尝试 人工创建验证文件

尝试手动在 /usr/share/nginx/html/.well-known/acme-challenge 目录中创建一个测试文件,然后通过浏览器或 curl 访问它:

mkdir -p /usr/share/nginx/html/.well-known/acme-challenge
echo "test" > /usr/share/nginx/html/.well-known/acme-challenge/testfile

然后尝试访问:

curl http://yourdomain.com/.well-known/acme-challenge/testfile

如果这个请求成功,说明 Nginx 配置正确且目录可访问。

宿主机certbot问题

这次尝试在阿里云centos上安装 certbot 一开始不太顺利,各种出错,所以后续调整为docker方案,但实际检查 certbot 是安装完成了。
如果certbot安装顺利,其实不需要用docker来运行,直接采用以下内容替换 运行certbot部分即可。后续有机会再行测试。

    sudo certbot certonly \
    --webroot --webroot-path=/usr/share/nginx/html \
    --agree-tos --email 527993075@qq.com \
    -d chenglai.net -d www.chenglai.net -d blog.chenglai.net

本次的续签也是使用了宿主机的 certbot。

yum 安装 Certbot 方案备份

步骤 1: 添加 EPEL 仓库

由于 Certbot 在 RHEL 和 CentOS 的官方仓库中通常不可用,你需要添加 EPEL (Extra Packages for Enterprise Linux) 仓库到你的系统:
CentOS 7:

sudo yum install epel-release

CentOS 8:
CentOS 8 自带 EPEL 仓库配置,但你需要手动启用:

sudo dnf install epel-release

步骤 2: 安装 Certbot

安装 Certbot 主程序:

sudo yum install certbot

步骤 3: 安装 Certbot 的 Web 服务器插件

根据你使用的 Web 服务器类型,你可能需要安装相应的 Certbot 插件。例如,如果你使用的是 Nginx 或 Apache,你可以安装相应的插件来自动配置 SSL 证书:

对于 Nginx:

sudo yum install certbot-nginx

对于 Apache:

sudo yum install certbot-apache

步骤 4: 获取或更新 SSL/TLS 证书

使用 Certbot 获取 SSL/TLS 证书。下面的命令示例使用 Nginx 作为 Web 服务器的自动配置方式(确保你的 Nginx 配置文件中的 server_name 指令正确设置了你的域名):

sudo certbot --nginx -d example.com -d www.example.com

如果你更喜欢手动方式或使用其他类型的 Web 服务器,你可以使用 webroot 插件:

sudo certbot certonly --webroot -w /var/www/html -d example.com -d www.example.com

步骤 5: 测试自动续订

Certbot 安装完成后,应该已自动设置了定期续订任务。测试自动续订是否正确设置:

sudo certbot renew --dry-run

如果命令成功执行,没有错误,那么证书续订设置应该是正确的。

步骤 6: 监控和维护

定期检查你的 SSL/TLS 证书和 Certbot 日志确保一切正常运行。监控 /var/log/letsencrypt/ 目录下的日志可以帮助你及时发现并解决可能的问题。

最后修改日期: 2024 年 10 月 29 日

作者

留言

后续 https://blog.chenglai.net/archives/257

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。