安装
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/)
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
}
重启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
再次修改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端口
完成
自动续签
设置 Certbot 的自动续签是确保你的 SSL 证书持续有效的重要步骤。Certbot 通常在安装时就配置了自动续签,但我们可以检查并确保它正确设置。这通常通过设置 cron 任务或使用 systemd 定时器实现。
检查 crontab
执行以下命令查看当前用户的 crontab 设置:
sudo crontab -l
打开编辑器:
在命令行中输入 crontab -e
并按回车。
进入插入模式:
按下 i 键进入编辑模式。
添加任务:
输入你的计划任务,例如:
0 */12 * * * certbot renew --quiet
保存和退出:
按下 Esc 键退出编辑模式。
输入 :wq(表示写入并退出)或者 :x(同样是写入并退出)。
按下 Enter 完成操作。
再次检查,完成
sudo crontab -l
确保生效,执行一次干运行测试(dry run)
sudo certbot renew --dry-run
这将模拟续订过程,但不会实际更换任何证书。如果此命令执行时没有错误,那么你的自动续签设置就很可能能在需要时正确工作。
成功:
失败:
监控续签日志:
虽然你使用了 --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 确认身份文件存放处
会创建一个隐藏文件夹,里面的文件也是执行完就没有了
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/ 目录下的日志可以帮助你及时发现并解决可能的问题。
留言
后续 https://blog.chenglai.net/archives/257