2024年 SSL 安全证书免费申请方法,非自签证书,含自动续签,nodejs提取续签日志
如果一个域名一定时间内申请超过5次,会被锁定至少1周时间,还有就是一个IP一天太频繁发起安全证书,也有可能被锁订单。● --email 88888888@qq.com 用您的电子邮件地址,以接收证书过期提醒等通知。如果Nginx配置没有问题并且已经正确安装,您可以继续进行以下步骤配置Nginx使用生成的证书。需要将要认证ssl的域名配置nginx的80端口,域名解析到指定的服务器IP,否则无法认证
注意1:
如果一个域名一定时间内申请超过5次,会被锁定至少1周时间,还有就是一个IP一天太频繁发起安全证书,也有可能被锁订单
前提条件
需要将要认证ssl的域名配置nginx的80端口,域名解析到指定的服务器IP,否则无法认证。
服务器测试环境
CentOS7.9 的nginx,域名是 ssl.域名.com
步骤
- 安装EPEL和Certbot: 先安装EPEL存储库,然后安装Certbot和Certbot Nginx插件。
sudo yum install epel-release -y
sudo yum install certbot python2-certbot-nginx -y
- 运行Certbot: 使用Certbot获取并安装SSL证书,指定域名为 ssl.域名.top。
当然,您可以使用命令行选项一次性执行Certbot命令,以避免交互式输入。以下是修改后的Certbot命令,其中包含所有必要的信息:
sudo certbot certonly --standalone -d ssl.域名.com --non-interactive --agree-tos --email 88888888@qq.com
在这个命令中:
● --non-interactive 选项使Certbot以非交互模式运行。
● --agree-tos 选项表示您同意Let’s Encrypt的服务条款。
● --email 88888888@qq.com 用您的电子邮件地址,以接收证书过期提醒等通知。
如果Nginx配置没有问题并且已经正确安装,您可以继续进行以下步骤配置Nginx使用生成的证书。
● 指定证书保存路径:
● 默认情况下,Certbot会将证书保存到 /etc/letsencrypt/live/ssl.域名.com/
目录中。这个路径包括以下文件:
● fullchain.pem:完整的证书链
● privkey.pem:私钥
● cert.pem:证书
● chain.pem:CA证书链
nginx配置
# 自申请安全证书
server {
listen 443 ssl;
server_name ssl.域名.com; # 更改为你的域名
ssl_certificate /etc/letsencrypt/live/ssl.域名.com/fullchain.pem; # 证书链文件
ssl_certificate_key /etc/letsencrypt/live/ssl.域名.com/privkey.pem; # 私钥文件
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # 可以使用 Mozilla 的推荐设置
# SSL 配置-安全设置
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';
ssl_prefer_server_ciphers on;
# 启用 HSTS(可选,但推荐)
# 添加这个头部可以让浏览器记住通过 HTTPS 而不是 HTTP 访问站点
add_header Strict-Transport-Security "max-age=63072000" always;
# 其它配置...
location / {
root /var/www/html; # 确认你的网站文件存放路径
index index.html index.htm;
}
}
重启nginx后,查看网站和证书
设置自动续签
自动续签通常通过设置一个定时任务(cron job)来实现。这是一个常见的设置例子:
编辑 crontab
crontab -e
进入后,在最后一行加上下面的执行语句和备注
# 添加下面这行到 crontab 中,让 Certbot 每天两次检查并续签证书,实际上1天检查一次就够了
0 */12 * * * certbot renew --quiet
然后保存
这个 cron job 会每 12 小时运行一次 certbot renew 命令,自动检查所有证书,并尝试续签那些即将过期的证书。使用 --quiet 参数可以减少命令输出,只在重要时刻通知用户。
注意事项
确保服务器的防火墙和安全设置允许 Certbot 进行必要的外部连接,尤其是到 Let’s Encrypt 的服务器。
如果你的网站配置发生变化,可能需要更新 Certbot 的验证设置。
使用自动续签时,应定期检查日志文件以确保续签过程中没有错误发生。
工作原理
自动检查:Certbot 会自动检查每个证书的到期时间,并确定是否需要续签。
续签所有证书:如果任何证书在下次运行时将在接近到期(通常是 30 天内),Certbot 会自动尝试续签。
无需额外配置:这个 cron job 不需要为每个域名进行单独配置。它适用于 Certbot 管理的所有证书。
确认设置
你可以通过以下命令手动运行一次续签命令来确认设置是否生效,并查看是否有任何错误或需要手动解决的问题:
certbot renew --dry-run
这个 --dry-run 选项会模拟续签过程而不会实际更新任何证书,它用来确保你的续签过程可以正常运行。
日志和监控
日志文件:Certbot 的操作会生成日志文件,通常位于 /var/log/letsencrypt 目录下。定期检查这些日志可以帮助你了解续签过程中的任何问题。
监控续签状态:建议你也设置一些监控措施来确保重要域名的证书确实被续签,如使用外部服务监控 HTTPS 状态或编写简单的脚本检查证书有效期。
从日志输出中可以看到,在执行 certbot renew --dry-run 的过程中,有一个证书续签成功,另一个失败。失败的主要原因是 Certbot 无法找到或执行 Nginx 的二进制文件。其他失败情况请自行寻找原因。
nodejs 获取哪些域名续签失败或不需要续签的域名信息
Certbot 日志保存在以下路径
/var/log/letsencrypt/letsencrypt.log
编写nodejs代码
const fs = require('fs');
const path = require('path');
//日志文件保存
const filePath = "node_log.txt";
// Certbot日志文件路径
const logFilePath = '/var/log/letsencrypt/letsencrypt.log';
// 读取日志文件内容
const output = fs.readFileSync(logFilePath, 'utf8');
// 解析需要记录的信息
const lines = output.split('\n');
const importantLines = lines.filter(line => line.includes('expires on') || line.includes('parsefail'));
// 写入文件
const logContent = importantLines.join('\n') + '\n';
fs.writeFileSync(filePath, logContent, {
flag: 'a'
});
console.log(`Certbot信息已保存到 ${filePath}`);
运行以上代码后,保存提取的日志记录到当前目录的node_log.txt 文件,内容如下
2024-08-26 15:02:01,702:DEBUG:certbot.display.util:Notifying user: /etc/letsencrypt/live/ssl.yczl.top/fullchain.pem expires on 2024-11-22 (skipped)
2024-08-26 15:02:01,702:DEBUG:certbot.display.util:Notifying user: /etc/letsencrypt/renewal/ssl.iplan.top.conf (parsefail)
至此,可以根据提前的日志信息,改造自己的nodejs代码,可以用于记录每个域名的过期时间或是否续签成功的情况,方便管理
服务器遇到的问题
服务器遇到的问题
服务器遇到的问题
1. 卸载当前的 Certbot 及相关插件
sudo yum remove certbot python2-certbot-nginx -y
2. 下载并运行 get-pip.py 以升级 pip
wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
sudo python get-pip.py
3. 验证 pip 版本
pip --version
4. 查找并移除旧版 pyOpenSSL
python -c "import OpenSSL; print(OpenSSL.__file__)"
假设输出为 /usr/lib/python2.7/site-packages/OpenSSL/init.pyc
sudo rm -rf /usr/lib/python2.7/site-packages/OpenSSL
sudo rm /usr/lib/python2.7/site-packages/pyOpenSSL-0.13.1-py2.7.egg-info
5. 通过 pip 安装/升级 pyOpenSSL 和 urllib3
sudo pip install --upgrade --ignore-installed 'pyOpenSSL>=0.14' 'urllib3>=1.21.1,<1.23'
6. 验证安装的版本
python -c "import OpenSSL; print(OpenSSL.__version__)"
python -c "import urllib3; print(urllib3.__version__)"
7. 重新通过 YUM 安装 Certbot 及其 Nginx 插件
sudo yum install certbot python2-certbot-nginx -y
8. 验证 Certbot 版本
certbot --version
9. 如果仍有错误,禁用额外仓库,清理缓存并重新安装 Certbot
sudo yum-config-manager --disable aegisbase aegisextras aegisupdates mysql-connectors-community mysql-tools-community mysql56-community
sudo yum clean all
sudo yum makecache
sudo yum install certbot python2-certbot-nginx -y
10. 验证 Certbot 版本
certbot --version
11. 运行 Certbot 获取 SSL 证书
sudo certbot certonly --standalone -d ssl.yourdomain.com --non-interactive --agree-tos --email your_email@example.com
(结束)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)