Cerbot
实战-Cerbot结合阿里云dns插件实现自动续期-20250305(测试成功)(推荐)
目录
[toc]
版权
参考《Hyde》大佬的《Certbot实现 HTTPS 免费证书(Let‘s Encrypt)自动续期》文章,十分感谢作者的手把手文档💖💖。
通过 dns 通配符去实现自动续期
这里推荐 @justjavac 大佬写的:https://github.com/justjavac/certbot-dns-aliyun ‘’参考大佬资料:http://blog.mnxz.fun/index.html?model=articleInfo&id=10
背景
当我们使用 certbot 申请通配符证书时,需要手动添加 TXT 记录。每个 certbot 申请的证书有效期为 3 个月,虽然 certbot 提供了自动续期命令,但是当我们把自动续期命令配置为定时任务时,我们无法手动添加新的 TXT 记录用于 certbot 验证。
好在 certbot 提供了一个 hook,可以编写一个 Shell 脚本。在续期的时候让脚本调用 DNS 服务商的 API 接口动态添加 TXT 记录,验证完成后再删除此记录。
前提
- 你已经有一个域名,并且域名解析托管在阿里云。
- 服务器上已经安装了 Certbot。
- 你已经配置了 alidns 脚本,用于自动添加和清理 DNS 记录
- 拥有阿里云的访问密钥(
AccessKey ID
和AccessKey Secret
),用于操作阿里云 DNS 服务。获取阿里云访问密钥(AccessKey ID 和 AccessKey Secret) 请参考官方文档:https://help.aliyun.com/zh/acr/create-and-obtain-an-accesskey-pair
🍊环境
- 系统: centos7
- 域名: 阿里云购买的域名
- nginx提供反向代理
🍊源码
通过网盘分享的文件:2025.3.5-实战-Cerbot自动续期(推荐)-20250305(测试成功)(推荐) 链接: https://pan.baidu.com/s/1qMP26jkcjRJyJKL--jt16Q?pwd=by6r 提取码: by6r 2025.3.5-实战-Cerbot自动续期(推荐)-20250305(测试成功)(推荐)
🍊说明
通过 Certbot 和阿里云 DNS 的集成,我们可以轻松实现 SSL 证书的自动续期。只需设置一次 cron 任务,Certbot 就会在证书到期前自动续期,并调用 alidns 脚本处理 DNS 挑战。
当前证书的到期时间为:2025/6/3日
包括主域名(https://onedayxyy.cn/),子域名(https://wiki.onedayxyy.cn/)
前言
域名定义
主域名/子域名
onedayxyy.cn
和 nas.onedayxyy.cn
这两个域名的主要区别在于它们的级别和可能指向的服务。
顶级域名(TLD)和二级域名(SLD):
onedayxyy.cn
: 这个域名是一个二级域名。.cn
是国家顶级域名(ccTLD),代表中国,而onedayxyy
是在.cn
下注册的二级域名。一般来说,这样的域名用于代表公司、组织或个人的主要网络地址。
子域名:
nas.onedayxyy.cn
: 这个域名是onedayxyy.cn
的子域名。子域名通常用于组织主域名下面的不同服务或内容。在这个例子中,nas
可能表示网络附加存储(Network Attached Storage),这意味着这个子域名可能指向与存储相关的服务或网站部分。
使用场景区别:
访问服务: 访问
onedayxyy.cn
通常会带你到该组织的主页或主要服务页面,而访问nas.onedayxyy.cn
可能会带你到专门的网络存储服务或提供特定功能的页面。配置和管理: 在域名系统(DNS)管理上,你可以为每个子域名配置不同的记录,这意味着
nas.onedayxyy.cn
可以指向一个不同的IP地址,或者使用不同的DNS记录,比如为了负载均衡、地理位置服务等。
在实际应用中,子域名非常有用,**它允许域名所有者创建特定的服务或分类内容,而不需要为每个服务注册新的域名。**这既减少了成本,也使得域名管理更加集中和方便。
==什么叫子域名==
域名可以划分为各个子域,子域还可以继续划分为子域的子域,这样就形成了顶级域、主域名、子域名等。
举例:
- “.com”是顶级域名(一级域名);
- “aliyun.com”是主域名(二级域名);
- “example.aliyun.com”是子域名(三级域名);
- “www.example.aliyun.com”是子域名的子域(四级域名)。
==为什么要设置子域名==
因为一个主域名可以设置出不同的子域名,所以能够便于用户将不同的子域名应用到不同的业务中。
例如主域名是
aliyun.com
,开发者则可以设置子域名api.aliyun.com
为接口业务使用,子域名pay.aliyun.com
为支付系统使用。实现访问者按照用户指定的子域名进行访问。
例如主域名是
aliyun.com
,开发者设置子域名为www.aliyun.com
和api.aliyun.com
后, 访问者输入这两个域名时就可以实现访问。
Certbot简介
- 关于certbot
- 官方部署方法
https://certbot.eff.org/instructions?ws=nginx&os=centosrhel7&tab=standard
- 指导手册
https://eff-certbot.readthedocs.io/en/latest/#
一些免费的证书提供商支持泛域名(通配符)证书
是的,有一些免费的证书提供商支持泛域名(通配符)证书。以下是一些常见的免费泛域名证书提供商:
(1)Let's Encrypt
🍊Let's Encrypt 是什么?
官网:https://letsencrypt.org/zh-cn/
Let's Encrypt 是一个免费的、自动化的、开放的证书颁发机构(Certificate Authority,CA),由 Internet Security Research Group (ISRG) 运营。其目标是通过提供免费和自动化的SSL/TLS证书,为全球网站提供更广泛的HTTPS支持,从而提升整个互联网的安全性。
使用 Let's Encrypt 的工具(如 Certbot)可以轻松申请和管理泛域名证书。
🍊Let's Encrypt 的特点
免费:
- Let's Encrypt 提供的 SSL/TLS 证书完全免费。这极大地降低了启用 HTTPS 的成本,使得任何网站都能负担得起安全加密的连接。
自动化:
- Let's Encrypt 通过其 ACME(Automatic Certificate Management Environment)协议实现了证书申请、颁发、安装和续期的自动化。这意味着用户可以通过工具(如
certbot
)自动获得和更新证书,而不需要手动干预。
- Let's Encrypt 通过其 ACME(Automatic Certificate Management Environment)协议实现了证书申请、颁发、安装和续期的自动化。这意味着用户可以通过工具(如
开放:
- Let's Encrypt 所有的代码和协议都是开源的,任何人都可以查看、使用和贡献。
简化:
- 传统的证书申请过程通常是复杂且繁琐的,而 Let's Encrypt 通过自动化工具简化了这一过程,使得任何人都可以轻松获取和管理证书。
安全性:
- Let's Encrypt 采用现代化的安全标准和实践,确保所提供证书的安全性和可靠性。
🍊Let's Encrypt 的背景和目标
Let's Encrypt 由多个知名组织和公司支持,包括 Mozilla、思科、Akamai、电子前哨基金会(EFF)等。其主要目标是:
- 提高互联网的安全性:通过推广 HTTPS,从而保护用户数据和隐私。
- 促进 HTTPS 的普及:让更多的网站能够更容易地启用 HTTPS,推动全网加密。
综上,Let's Encrypt 通过提供免费、自动化和高效的 SSL/TLS 证书,大大降低了启用 HTTPS 的门槛,推动了互联网的安全和隐私保护。
🍊acme.sh
说完 Let's Encrypt 后,还得再提到一个 acme.sh,它是用于从 Let‘s Encrypt 生成免费的证书,具备以下几个特点:
acme.sh地址:https://github.com/acmesh-official/acme.sh
一个纯粹用 Shell(Unix shell) 语言编写的 ACME 协议客户端。
完整的 ACME 协议实施。支持 ACME v1 和 ACME v2 支持 ACME v2 通配符证书
简单,功能强大且易于使用。你只需要 3 分钟就可以学习它。
Let's Encrypt 免费证书客户端最简单的 Shell 脚本。
纯粹用 Shell 编写,不依赖于 python 或官方的 Let's Encrypt 客户端。
只需一个脚本即可自动颁发,续订和安装证书。不需要 root/sudoer 访问权限。
支持在 Docker 内使用,支持 IPv6。
(2)ZeroSSL
- ZeroSSL 也提供了免费的泛域名证书,并且支持 ACME 协议,可以通过 Certbot 或其他 ACME 客户端进行申请。
- 使用 ZeroSSL 的步骤与 Let's Encrypt 类似,只需在 Certbot 中指定 ZeroSSL 的服务器地址即可。
(3)Cloudflare
- 如果您使用 Cloudflare 作为您的 DNS 服务提供商,Cloudflare 提供了免费的 SSL/TLS 加密服务,包括泛域名证书。
- 您只需在 Cloudflare 的控制面板中启用 SSL/TLS 加密,它会自动为您提供泛域名证书。
1、安装工具
🍊 (1)安装 aliyun cli 工具
wget https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tgz
tar xzvf aliyun-cli-linux-latest-amd64.tgz
sudo cp aliyun /usr/local/bin
rm -f aliyun
验证 aliyun cli 工具是否成功:
打开终端,输入 aliyun
命令并回车。如果安装成功,会显示阿里云 CLI 的帮助信息,包含可用的命令和选项
示例输出如下:
🍊 (2)安装 certbot-dns-aliyun 插件
#下载、部署并配置一个名为 alidns.sh 的脚本
wget https://cdn.jsdelivr.net/gh/justjavac/certbot-dns-aliyun@main/alidns.sh
sudo cp alidns.sh /usr/local/bin
sudo chmod +x /usr/local/bin/alidns.sh
sudo ln -s /usr/local/bin/alidns.sh /usr/local/bin/alidns
如果下载失败手动前往 github 下载:https://github.com/justjavac/certbot-dns-aliyun/blob/main/alidns.sh
2、配置凭证
安装完成后,你需要对阿里云 CLI 进行配置,使其能够访问你的阿里云账户。可以使用以下命令进行配置:
shaliyun configure set --profile AkProfile --mode AK --access-key-id 替换为你自己的真实 AccessKey ID --access-key-secret 替换为你自己的真实 AccessKey Secret --region 替换为你希望使用的阿里云地域的 ID
#示例命令
shaliyun configure set --profile AkProfile --mode AK --access-key-id LTAI5123456nqCY --access-key-secret mED1234560tBw --region cn-shanghai #这里秘钥我加过密的哦
按照提示输入你的阿里云访问密钥(AccessKey ID 和 AccessKey Secret)、默认的地域 ID 等信息,配置完成后就可以使用阿里云 CLI 工具来管理你的阿里云资源了。
如何获取阿里云访问密钥(AccessKey ID 和 AccessKey Secret)请参考官方文档:https://help.aliyun.com/zh/acr/create-and-obtain-an-accesskey-pair
获取 Region Id 请参考官方文档:https://help.aliyun.com/zh/cli/configure-credentials?spm=a2c4g.11186623.0.i1#41e7063556zzq 或者使用
aliyun ecs DescribeRegions
命令获取阿里云 ECS 支持的地域信息- 输出:
aliyun configure
🍊 验证配置
配置完成后,你可以使用以下命令来验证配置是否生效:
aliyun configure list
输出:
[root@blog ~]# aliyun configure list
Profile | Credential | Valid | Region | Language
--------- | ------------------ | ------- | ---------------- | --------
default | | Invalid | | en
AkProfile * | AK:***jAc | Valid | oss-cn-shanghai | en
#目前存在两个配置文件,分别是 default 和 AkProfile。其中 AkProfile 后面带有 * 号,这表明当前使用的默认配置文件是 AkProfile。
🍊 配置日志文件
sudo touch /var/log/certbot-renew.log
sudo chmod 644 /var/log/certbot-renew.log
3、申请证书
测试是否能正确申请:
警告
.onedayxyy.cn 请换成自己的主域名
certbot certonly -d onedayxyy.cn -d *.onedayxyy.cn --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean" --dry-run
#输出
[root@blog ~]# certbot certonly -d onedayxyy.cn -d *.onedayxyy.cn --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean" --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Simulating a certificate request for *.onedayxyy.cn
Hook '--manual-auth-hook' for onedayxyy.cn ran with output:
{
"RecordId": "189619603129344",
"RequestId": "572026AD-B305831B4ABE"
}
Hook '--manual-cleanup-hook' for onedayxyy.cn ran with output:
{
"RecordId": "18961344",
"RequestId": "8B219E945642"
}
The dry run was successful.
#看到"The dry run was successful."模拟成功!
正式申请时去掉 --dry-run
参数:
certbot certonly -d onedayxyy.cn -d *.onedayxyy.cn --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean"
输出:
[root@blog ~]# certbot certonly -d onedayxyy.cn -d *.onedayxyy.cn --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean"
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for *.onedayxyy.cn
Hook '--manual-auth-hook' for onedayxyy.cn ran with output:
{
"RecordId": "189619072",
"RequestId": "654E1FE97B193D5A"
}
Hook '--manual-cleanup-hook' for onedayxyy.cn ran with output:
{
"RecordId": "1896643072",
"RequestId": "492AB-75267001AAB7"
}
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/onedayxyy.cn-0001/fullchain.pem
Key is saved at: /etc/letsencrypt/live/onedayxyy.cn-0001/privkey.pem
This certificate expires on 2025-05-31.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
* Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
* Donating to EFF: https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
参数说明
- -d example.com:指定域名(可以指定多个域名)。
- manual:手动模式。
- preferred-challenges dns:使用 DNS 挑战。
- manual-auth-hook “alidns”:在 DNS 挑战时调用 alidns 脚本。
- manual-cleanup-hook “alidns clean”:在 DNS 挑战完成后调用 alidns clean 脚本。
- —dry-run:模拟续期过程,不会实际续期证书。正式申请时去掉—dry-run参数:
查看下证书:
Certificate is saved at: /etc/letsencrypt/live/onedayxyy.cn-0001/fullchain.pem
Key is saved at: /etc/letsencrypt/live/onedayxyy.cn-0001/privkey.pem
[root@blog ~]# ll /etc/letsencrypt/live/onedayxyy.cn-0001/fullchain.pem
lrwxrwxrwx 1 root root 46 Mar 2 21:55 /etc/letsencrypt/live/onedayxyy.cn-0001/fullchain.pem -> ../../archive/onedayxyy.cn-0001/fullchain1.pem
[root@blog ~]# ll /etc/letsencrypt/live/onedayxyy.cn-0001/privkey.pem
lrwxrwxrwx 1 root root 44 Mar 2 21:55 /etc/letsencrypt/live/onedayxyy.cn-0001/privkey.pem -> ../../archive/onedayxyy.cn-0001/privkey1.pem
[root@blog ~]#
4、配置证书
将上面获取到的证书配置到自己的nginx:(如果有cdn也需要配置到cdn里哦)
vim /etc/nginx/conf.d/wiki.onedayxyy.cn.conf
详细信息
# cat /etc/nginx/conf.d/wiki.onedayxyy.cn.conf
server {
listen 80;
server_name wiki.onedayxyy.cn;
#配置https重定向
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name wiki.onedayxyy.cn;
root /root/rsync/rsync-vitepress/dist;
location / {
index index.html index.htm;
}
location /images {
alias /images;
index index.html;
valid_referers none blocked *.onedayxyy.cn onedayxyy.cn *.gitee.com gitee.com localhost 127.0.0.1;
if ( $invalid_referer ) {
# 如不满足,指定访问如下资源
rewrite ^/ https://onedayxyy.cn/error/1.png;
return 403;
}
}
location /home {
alias /root/home3.0/;
index index.html index.htm;
}
location /wiki {
alias /root/rsync/rsync-docusaurus/build;
index index.html index.htm;
}
location /newyear {
alias /root/rsync/rsync-qianduan-demo/qianduan-demo/newyear;
index index.html index.htm;
}
location /error {
autoindex on; # 启用目录索引
alias /FdangDaoLianImages;
index index.html; # 默认显示index.html文件,如果没有则列出目录内容
}
ssl_certificate /etc/letsencrypt/live/onedayxyy.cn-0001/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/onedayxyy.cn-0001/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=31536000";
access_log /var/log/nginx/wiki.onedayxyy.cn.https.log;
}
- 重启nginx:
nginx -s reload
- 配置下cdn
cat /etc/letsencrypt/live/onedayxyy.cn-0001/fullchain.pem
cat /etc/letsencrypt/live/onedayxyy.cn-0001/privkey.pem
拷贝证书的公钥和私钥内容到cdn配置里:
- 浏览器验证下
可以看到自己的主域名和子域名的证书都是正常的。(完美😜)
5、证书续期
certbot renew --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean" --dry-run
如果以上命令没有错误,把 --dry-run
参数去掉。
certbot renew --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean"
🍊 检查证书状态
运行以下命令查看证书的到期时间:
certbot certificates
输出:
[root@blog ~]# certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Renewal configuration file /etc/letsencrypt/renewal/onedayxyy.cn.conf produced an unexpected error: expected /etc/letsencrypt/live/onedayxyy.cn/cert.pem to be a symlink. Skipping.
Renewal configuration file /etc/letsencrypt/renewal/wiki.onedayxyy.cn.conf produced an unexpected error: expected /etc/letsencrypt/live/wiki.onedayxyy.cn/cert.pem to be a symlink. Skipping.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
Certificate Name: onedayxyy.cn-0001
Serial Number: 3b19b47d3bf12688b69a9189e9da78cc117
Key Type: ECDSA
Domains: *.onedayxyy.cn
Expiry Date: 2025-05-31 12:57:22+00:00 (VALID: 89 days)
Certificate Path: /etc/letsencrypt/live/onedayxyy.cn-0001/fullchain.pem
Private Key Path: /etc/letsencrypt/live/onedayxyy.cn-0001/privkey.pem
The following renewal configurations were invalid:
/etc/letsencrypt/renewal/onedayxyy.cn.conf
/etc/letsencrypt/renewal/wiki.onedayxyy.cn.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[root@blog ~]#
6、自动续期
添加定时任务 crontab。
crontab -e
然后添加以下配置:
1 1 */1 * * root certbot renew --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean" --deploy-hook "nginx -s reload"
上面脚本中的 --deploy-hook "nginx -s reload"
表示在续期成功后自动重启 nginx。
FAQ
案例:certbot-renew.log 没有日志输出
没有日志输出,如果 /var/log/certbot-renew.log 没有日志输出,可能是以下原因: 权限问题:确保日志文件可写:
警告
这里需要执行下这2行命令的,否则没这个日志文件;
sudo touch /var/log/certbot-renew.log
sudo chmod 644 /var/log/certbot-renew.log
案例:cron 任务未执行
检查 cron 日志:
grep CRON /var/log/syslog
案例:证书未到期
如果证书未到期,Certbot 会跳过续期。可以通过以下命令强制续期:
certbot renew --force-renewal --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean"
案例:如何获取阿里云访问密钥及Region Id
(1)如何获取阿里云访问密钥(AccessKey ID 和 AccessKey Secret)请参考官方文档:https://help.aliyun.com/zh/acr/create-and-obtain-an-accesskey-pair
(2)获取 Region Id 请参考官方文档:https://help.aliyun.com/zh/cli/configure-credentials?spm=a2c4g.11186623.0.i1#41e7063556zzq 或者使用 aliyun ecs DescribeRegions
命令获取阿里云 ECS 支持的地域信息
详细信息
[root@blog ~]# aliyun ecs DescribeRegions
{
"Regions": {
"Region": [
{
"LocalName": "华北1(青岛)",
"RegionEndpoint": "ecs.cn-qingdao.aliyuncs.com",
"RegionId": "cn-qingdao"
},
{
"LocalName": "华北2(北京)",
"RegionEndpoint": "ecs.cn-beijing.aliyuncs.com",
"RegionId": "cn-beijing"
},
{
"LocalName": "华北3(张家口)",
"RegionEndpoint": "ecs.cn-zhangjiakou.aliyuncs.com",
"RegionId": "cn-zhangjiakou"
},
{
"LocalName": "华北5(呼和浩特)",
"RegionEndpoint": "ecs.cn-huhehaote.aliyuncs.com",
"RegionId": "cn-huhehaote"
},
{
"LocalName": "华北6(乌兰察布)",
"RegionEndpoint": "ecs.cn-wulanchabu.aliyuncs.com",
"RegionId": "cn-wulanchabu"
},
{
"LocalName": "华东1(杭州)",
"RegionEndpoint": "ecs.aliyuncs.com",
"RegionId": "cn-hangzhou"
},
{
"LocalName": "华东2(上海)",
"RegionEndpoint": "ecs.cn-shanghai.aliyuncs.com",
"RegionId": "cn-shanghai"
},
{
"LocalName": "华东5(南京-本地地域)",
"RegionEndpoint": "ecs.cn-nanjing.aliyuncs.com",
"RegionId": "cn-nanjing"
},
{
"LocalName": "华南1(深圳)",
"RegionEndpoint": "ecs.cn-shenzhen.aliyuncs.com",
"RegionId": "cn-shenzhen"
},
{
"LocalName": "华南2(河源)",
"RegionEndpoint": "ecs.cn-heyuan.aliyuncs.com",
"RegionId": "cn-heyuan"
},
{
"LocalName": "华南3(广州)",
"RegionEndpoint": "ecs.cn-guangzhou.aliyuncs.com",
"RegionId": "cn-guangzhou"
},
{
"LocalName": "华东6(福州-本地地域)",
"RegionEndpoint": "ecs.cn-fuzhou.aliyuncs.com",
"RegionId": "cn-fuzhou"
},
{
"LocalName": "华中1(武汉-本地地域)",
"RegionEndpoint": "ecs.cn-wuhan-lr.aliyuncs.com",
"RegionId": "cn-wuhan-lr"
},
{
"LocalName": "西南1(成都)",
"RegionEndpoint": "ecs.cn-chengdu.aliyuncs.com",
"RegionId": "cn-chengdu"
},
{
"LocalName": "中国香港",
"RegionEndpoint": "ecs.cn-hongkong.aliyuncs.com",
"RegionId": "cn-hongkong"
},
{
"LocalName": "日本(东京)",
"RegionEndpoint": "ecs.ap-northeast-1.aliyuncs.com",
"RegionId": "ap-northeast-1"
},
{
"LocalName": "韩国(首尔)",
"RegionEndpoint": "ecs.ap-northeast-2.aliyuncs.com",
"RegionId": "ap-northeast-2"
},
{
"LocalName": "新加坡",
"RegionEndpoint": "ecs.ap-southeast-1.aliyuncs.com",
"RegionId": "ap-southeast-1"
},
{
"LocalName": "马来西亚(吉隆坡)",
"RegionEndpoint": "ecs.ap-southeast-3.aliyuncs.com",
"RegionId": "ap-southeast-3"
},
{
"LocalName": "菲律宾(马尼拉)",
"RegionEndpoint": "ecs.ap-southeast-6.aliyuncs.com",
"RegionId": "ap-southeast-6"
},
{
"LocalName": "印度尼西亚(雅加达)",
"RegionEndpoint": "ecs.ap-southeast-5.aliyuncs.com",
"RegionId": "ap-southeast-5"
},
{
"LocalName": "泰国(曼谷)",
"RegionEndpoint": "ecs.ap-southeast-7.aliyuncs.com",
"RegionId": "ap-southeast-7"
},
{
"LocalName": "美国(弗吉尼亚)",
"RegionEndpoint": "ecs.us-east-1.aliyuncs.com",
"RegionId": "us-east-1"
},
{
"LocalName": "美国(硅谷)",
"RegionEndpoint": "ecs.us-west-1.aliyuncs.com",
"RegionId": "us-west-1"
},
{
"LocalName": "墨西哥",
"RegionEndpoint": "ecs.na-south-1.aliyuncs.com",
"RegionId": "na-south-1"
},
{
"LocalName": "英国(伦敦)",
"RegionEndpoint": "ecs.eu-west-1.aliyuncs.com",
"RegionId": "eu-west-1"
},
{
"LocalName": "阿联酋(迪拜)",
"RegionEndpoint": "ecs.me-east-1.aliyuncs.com",
"RegionId": "me-east-1"
},
{
"LocalName": "德国(法兰克福)",
"RegionEndpoint": "ecs.eu-central-1.aliyuncs.com",
"RegionId": "eu-central-1"
}
]
},
"RequestId": "CB0F1AC0-5E28-54EA-A2A9-5F583B2D7A0D"
}
[root@blog ~]#
案例:http获取证书方式不支持泛域名证书生成
警告
Let's Encrypt 对通配符域名的验证要求使用 DNS 验证(
dns-01
),而不是 HTTP 验证(http-01
) ;(即http获取证书方式不支持泛域名证书生成)因此,推荐使用dns方式来生成泛域名证书;
案例:cdn加速主域名后是默认不会对子域名也加速的
问题:cdn上我配置的是对主域名onedayxyy.cn加速,请问这个对其子域名wiki.onedayxyy.cn也会加速吗?-2024.7.24(已解决)
回答:
警告
CDN(内容分发网络)的配置通常是针对具体的域名进行的。因此,如果您的 CDN 配置是针对主域名
onedayxyy.cn
进行加速,那么它并不会自动对子域名wiki.onedayxyy.cn
进行加速。子域名需要单独配置才能享受 CDN 加速服务。
案例:切记申请泛域名证书的命令方式
🍊问题:
我利用certbot申请的*.onedayxyy.cn泛域名证书,给子域名wiki.onedayxyy.cn都能正常使用,但是主域名onedayxyy.cn依然报不安全的证书,这个是为什么呢?
🍊gpt回答:
当你使用 Certbot 申请泛域名证书(例如
*.onedayxyy.cn
)时,该证书通常只覆盖通配符子域名,而不包括主域名(例如onedayxyy.cn
)。这是由于泛域名证书的定义方式所决定的。
解决方法
要确保主域名 onedayxyy.cn
也能使用安全的证书,你需要在申请证书时明确包含主域名。以下是具体步骤:
重新申请证书: 使用 Certbot 重新申请证书,并在命令中明确指定主域名和泛域名。例如:
shsudo certbot certonly --manual -d onedayxyy.cn -d *.onedayxyy.cn
这样,Certbot 会生成一个包含主域名
onedayxyy.cn
和泛域名*.onedayxyy.cn
的证书。配置 Nginx: 确保你的 Nginx 配置文件中正确引用了新生成的证书。例如:
nginxserver { listen 443 ssl; server_name onedayxyy.cn; ssl_certificate /etc/letsencrypt/live/onedayxyy.cn/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/onedayxyy.cn/privkey.pem; # 其他配置... } server { listen 443 ssl; server_name wiki.onedayxyy.cn; ssl_certificate /etc/letsencrypt/live/onedayxyy.cn/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/onedayxyy.cn/privkey.pem; # 其他配置... }
验证和重新加载 Nginx: 在修改配置文件后,使用以下命令测试配置文件的语法是否正确:
shsudo nginx -t
如果测试通过,使用以下命令重新加载 Nginx 配置:
shsudo systemctl reload nginx
通过以上步骤,你应该能够确保主域名 onedayxyy.cn
和泛域名 *.onedayxyy.cn
都能使用安全的证书。
🍊自己重新再测试:
#有问题版
certbot -d *.onedayxyy.cn --manual --config-dir config --work-dir work --logs-dir logs --preferred-challenges dns certonly
#gpt回答版
sudo certbot certonly --manual -d onedayxyy.cn -d *.onedayxyy.cn
#正确版
certbot -d onedayxyy.cn -d *.onedayxyy.cn --manual --config-dir config --work-dir work --logs-dir logs --preferred-challenges dns certonly
之前生成的:
先删除目录,再进行测试:
rm -rf config/
certbot -d onedayxyy.cn -d *.onedayxyy.cn --manual --config-dir config --work-dir work --logs-dir logs --preferred-challenges dns certonly
[root@ruyub-blog-prod onedayxyy.cn]# pwd
/root/config/archive/onedayxyy.cn
[root@ruyub-blog-prod onedayxyy.cn]# ll
total 16
-rw-r--r-- 1 root root 1289 Aug 3 10:00 cert1.pem
-rw-r--r-- 1 root root 1566 Aug 3 10:00 chain1.pem
-rw-r--r-- 1 root root 2855 Aug 3 10:00 fullchain1.pem
-rw------- 1 root root 241 Aug 3 10:00 privkey1.pem
[root@ruyub-blog-prod onedayxyy.cn]#
再次把这2个证书进行替换,测试:
重启nginx:
nginx -s reload
🍊验证:(完美)
案例:通配符证书的概念
问题:
我的域名是onedayxyy.cn,然后我为他申请了一个https证书,且在nginx里已经配置了https证书。
但是我现在使用了wiki.onedayxyy.cn子域名来提供wiki服务,那么我想通过https://wiki.onedayxyy.cn
访问,请问原来的https证书能直接配置给我的子域名wiki.onedayxyy.cn吗?
gpt回答:
如果您已经为
onedayxyy.cn
申请了一个通配符证书(例如*.onedayxyy.cn
),那么这个证书将自动覆盖所有子域名,包括wiki.onedayxyy.cn
。通配符证书允许您在一个证书中保护主域名下的所有子域名。
如果您申请的是单域名证书(例如
onedayxyy.cn
),那么这个证书只能用于onedayxyy.cn
这个域名,而不能用于wiki.onedayxyy.cn
这个子域名。在这种情况下,您需要为wiki.onedayxyy.cn
单独申请一个新的证书。
案例:AlphaSSL泛域名通配符证书
30元实现AlphaSSL泛域名通配符证书一年及补全检查证书链完整性(收藏)
30元实现AlphaSSL泛域名通配符证书一年及补全检查证书链完整性
案例:cfgssl/openssl和cerbot签发方式的区别
利用 cfssl
、openssl
和 certbot
生成的 HTTPS 证书在安全性和功能上没有本质的区别,但它们在使用和管理上的细节有所不同。下面是对这几种工具的简单比较:
1.cfssl
(Cloudflare's PKI/TLS toolkit)
优点:
- 灵活性和可配置性:
cfssl
提供了一整套工具,用于生成和管理证书,包括生成证书请求(CSR)、签发证书、验证证书链等等。 - 自动化和集成:适合 DevOps 环境,可以轻松与其他自动化工具集成。
- 自签名证书:适用于内部工具或环境中需要自签名证书的情况。
缺点:
- 学习曲线:对于新手来说,可能需要一些时间来熟悉和配置。
2.openssl
优点:
- 通用性和广泛支持:
openssl
是一个非常强大的工具,几乎可以在任何操作系统上使用。 - 灵活性:可以用来创建 CSR、签发自签名证书、转换证书格式等。
- 细粒度控制:提供了非常多的选项和参数,允许用户详细配置证书属性。
缺点:
- 复杂性:非常灵活但同时也很复杂,对于新手来说可能不太友好。
- 手动管理:需要手动更新和管理证书,适合技术熟练的用户。
3.certbot
(==Let's Encrypt 的官方客户端==)
优点:
- 免费和自动化:
certbot
提供免费的 SSL/TLS 证书,并且可以自动化证书的获取和续期。 - 简单易用:非常适合没有太多经验的用户,通过简单的命令即可获取和安装证书。
- 广泛支持:支持多数常见的 Web 服务器,如 Apache、Nginx 等。
缺点:
- 公有证书:
certbot
主要申请的是 Let's Encrypt 提供的公共信任的证书,不能生成内部使用的自签名证书。 - 频率限制:Let's Encrypt 对证书申请有频率限制(例如,每个域名每周最多申请一定数量的证书)。
主要区别总结:
使用场景:
- certbot:主要用于快速获取和自动续期公共信任的 SSL/TLS 证书,适合需要快速部署 HTTPS 并保持证书自动更新的用户。
- cfssl 和 openssl:适用于需要更高灵活性和定制化的场景,包括自签名证书、内部 CA 管理等。
操作复杂度:
- certbot:操作简单,非常适合新手和不需要复杂定制的用户。
- cfssl 和 openssl:功能强大但操作相对复杂,适合有一定技术背景和定制需求的用户。
自动化:
- certbot:内置自动续期功能,适合需要长期维护的互联网业务。
- cfssl 和 openssl:需要自行编写脚本或工具来实现自动化管理。
证书类型:
- certbot:主要用于获取 Let's Encrypt 提供的公共信任证书。
- cfssl 和 openssl:可以用于生成自签名证书和内部 CA 签发的证书。
🍊综合来说:
如果你的需求是为公开访问的网站快速、自动化地获取和管理 HTTPS 证书,
certbot
是首选工具;而如果你需要更高的灵活性和定制化,特别是生成自签名证书或管理内部 CA,
cfssl
和openssl
会是更好的选择。
总结
通过 Certbot 和阿里云 DNS 的集成,我们可以轻松实现 SSL 证书的自动续期。只需设置一次 cron 任务,Certbot 就会在证书到期前自动续期,并调用 alidns 脚本处理 DNS 挑战。
关于我
我的博客主旨:
- 排版美观,语言精炼;
- 文档即手册,步骤明细,拒绝埋坑,提供源码;
- 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!
🍀 个人网站
🍀 微信二维码
x2675263825 (舍得), qq:2675263825。
🍀 微信公众号
《云原生架构师实战》
🍀 csdn
https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421
🍀 知乎
https://www.zhihu.com/people/foryouone
最后
好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!