Skip to content

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 IDAccessKey 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(测试成功)(推荐)

image-20250305074358415

🍊说明

通过 Certbot 和阿里云 DNS 的集成,我们可以轻松实现 SSL 证书的自动续期。只需设置一次 cron 任务,Certbot 就会在证书到期前自动续期,并调用 alidns 脚本处理 DNS 挑战。

当前证书的到期时间为:2025/6/3日

包括主域名(https://onedayxyy.cn/),子域名(https://wiki.onedayxyy.cn/)

image-20250305073708731

image-20250305073737633

前言

域名定义

image-20240802193419872

主域名/子域名

onedayxyy.cnnas.onedayxyy.cn 这两个域名的主要区别在于它们的级别和可能指向的服务。

  1. 顶级域名(TLD)和二级域名(SLD):

    • onedayxyy.cn: 这个域名是一个二级域名。.cn 是国家顶级域名(ccTLD),代表中国,而 onedayxyy 是在 .cn 下注册的二级域名。一般来说,这样的域名用于代表公司、组织或个人的主要网络地址。
  2. 子域名:

    • nas.onedayxyy.cn: 这个域名是 onedayxyy.cn子域名。子域名通常用于组织主域名下面的不同服务或内容。在这个例子中,nas 可能表示网络附加存储(Network Attached Storage),这意味着这个子域名可能指向与存储相关的服务或网站部分。

使用场景区别:

  • 访问服务: 访问 onedayxyy.cn 通常会带你到该组织的主页或主要服务页面,而访问 nas.onedayxyy.cn 可能会带你到专门的网络存储服务或提供特定功能的页面。

  • 配置和管理: 在域名系统(DNS)管理上,你可以为每个子域名配置不同的记录,这意味着 nas.onedayxyy.cn 可以指向一个不同的IP地址,或者使用不同的DNS记录,比如为了负载均衡、地理位置服务等。

在实际应用中,子域名非常有用,**它允许域名所有者创建特定的服务或分类内容,而不需要为每个服务注册新的域名。**这既减少了成本,也使得域名管理更加集中和方便。

==什么叫子域名==

域名可以划分为各个子域,子域还可以继续划分为子域的子域,这样就形成了顶级域、主域名、子域名等。

image-20240606112050930

举例:

  • “.com”是顶级域名(一级域名);
  • “aliyun.com”是主域名(二级域名);
  • “example.aliyun.com”是子域名(三级域名);
  • “www.example.aliyun.com”是子域名的子域(四级域名)。

==为什么要设置子域名==

  1. 因为一个主域名可以设置出不同的子域名,所以能够便于用户将不同的子域名应用到不同的业务中。

    例如主域名是aliyun.com,开发者则可以设置子域名api.aliyun.com为接口业务使用,子域名 pay.aliyun.com为支付系统使用。

  2. 实现访问者按照用户指定的子域名进行访问。

    例如主域名是aliyun.com,开发者设置子域名为www.aliyun.comapi.aliyun.com后, 访问者输入这两个域名时就可以实现访问。

Certbot简介

  • 关于certbot

image-20240803071422778

  • 官方部署方法

https://certbot.eff.org/instructions?ws=nginx&os=centosrhel7&tab=standard

image-20240803062215121

  • 指导手册

https://eff-certbot.readthedocs.io/en/latest/#

image-20240803072046374

一些免费的证书提供商支持泛域名(通配符)证书

是的,有一些免费的证书提供商支持泛域名(通配符)证书。以下是一些常见的免费泛域名证书提供商:

(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)可以轻松申请和管理泛域名证书。

image-20240806070353215

🍊Let's Encrypt 的特点

  1. 免费

    • Let's Encrypt 提供的 SSL/TLS 证书完全免费。这极大地降低了启用 HTTPS 的成本,使得任何网站都能负担得起安全加密的连接。
  2. 自动化

    • Let's Encrypt 通过其 ACME(Automatic Certificate Management Environment)协议实现了证书申请、颁发、安装和续期的自动化。这意味着用户可以通过工具(如 certbot)自动获得和更新证书,而不需要手动干预。
  3. 开放

    • Let's Encrypt 所有的代码和协议都是开源的,任何人都可以查看、使用和贡献。
  4. 简化

    • 传统的证书申请过程通常是复杂且繁琐的,而 Let's Encrypt 通过自动化工具简化了这一过程,使得任何人都可以轻松获取和管理证书。
  5. 安全性

    • 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 v1ACME 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 工具

sh
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 的帮助信息,包含可用的命令和选项

示例输出如下:

image-20250302213139146

🍊 (2)安装 certbot-dns-aliyun 插件

sh
#下载、部署并配置一个名为 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 进行配置,使其能够访问你的阿里云账户。可以使用以下命令进行配置:

    sh
    aliyun configure set  --profile AkProfile --mode AK  --access-key-id 替换为你自己的真实 AccessKey ID --access-key-secret 替换为你自己的真实 AccessKey Secret   --region 替换为你希望使用的阿里云地域的 ID

    #示例命令

    sh
    aliyun 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

    image-20250302220712597

🍊 验证配置

配置完成后,你可以使用以下命令来验证配置是否生效:

sh
aliyun configure list

输出:

sh
[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。

🍊 配置日志文件

bash
sudo touch /var/log/certbot-renew.log
sudo chmod 644 /var/log/certbot-renew.log

3、申请证书

测试是否能正确申请:

警告

.onedayxyy.cn 请换成自己的主域名

sh
certbot certonly -d onedayxyy.cn -d *.onedayxyy.cn --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean" --dry-run
sh
#输出
[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 参数:

sh
certbot certonly -d onedayxyy.cn -d *.onedayxyy.cn --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean"

输出:

bash
[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参数:

查看下证书:

bash
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

详细信息
bash
# 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:
bash
nginx -s reload
  • 配置下cdn
bash
cat      /etc/letsencrypt/live/onedayxyy.cn-0001/fullchain.pem
cat  /etc/letsencrypt/live/onedayxyy.cn-0001/privkey.pem

拷贝证书的公钥和私钥内容到cdn配置里:

image-20250302224620546

  • 浏览器验证下

可以看到自己的主域名和子域名的证书都是正常的。(完美😜)

image-20250305073708731

image-20250305073737633

5、证书续期

sh
certbot renew --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean" --dry-run

如果以上命令没有错误,把 --dry-run 参数去掉。

sh
certbot renew --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean"

🍊 检查证书状态

运行以下命令查看证书的到期时间:

sh
certbot certificates

输出:

bash
[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。

sh
crontab -e

然后添加以下配置:

sh
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行命令的,否则没这个日志文件;

sh
sudo touch /var/log/certbot-renew.log
sudo chmod 644 /var/log/certbot-renew.log

案例:cron 任务未执行

检查 cron 日志:

sh
grep CRON /var/log/syslog

案例:证书未到期

如果证书未到期,Certbot 会跳过续期。可以通过以下命令强制续期:

sh
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

PixPin_2025-03-02_22-39-25

(2)获取 Region Id 请参考官方文档:https://help.aliyun.com/zh/cli/configure-credentials?spm=a2c4g.11186623.0.i1#41e7063556zzq 或者使用 aliyun ecs DescribeRegions 命令获取阿里云 ECS 支持的地域信息

详细信息
bash
[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依然报不安全的证书,这个是为什么呢?

https://onedayxyy.cn/

image-20240803095048063

https://wiki.onedayxyy.cn/

image-20240803095104547

🍊gpt回答:

当你使用 Certbot 申请泛域名证书(例如 *.onedayxyy.cn)时,该证书通常只覆盖通配符子域名,而不包括主域名(例如 onedayxyy.cn)。这是由于泛域名证书的定义方式所决定的。

解决方法

要确保主域名 onedayxyy.cn 也能使用安全的证书,你需要在申请证书时明确包含主域名。以下是具体步骤:

  1. 重新申请证书: 使用 Certbot 重新申请证书,并在命令中明确指定主域名和泛域名。例如:

    sh
    sudo certbot certonly --manual -d onedayxyy.cn -d *.onedayxyy.cn

    这样,Certbot 会生成一个包含主域名 onedayxyy.cn 和泛域名 *.onedayxyy.cn 的证书。

  2. 配置 Nginx: 确保你的 Nginx 配置文件中正确引用了新生成的证书。例如:

    nginx
    server {
        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;
    
        # 其他配置...
    }
  3. 验证和重新加载 Nginx: 在修改配置文件后,使用以下命令测试配置文件的语法是否正确:

    sh
    sudo nginx -t

    如果测试通过,使用以下命令重新加载 Nginx 配置:

    sh
    sudo systemctl reload nginx

通过以上步骤,你应该能够确保主域名 onedayxyy.cn 和泛域名 *.onedayxyy.cn 都能使用安全的证书。

🍊自己重新再测试:

bash
#有问题版
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

之前生成的:

image-20240803095424151

先删除目录,再进行测试:

bash
rm -rf config/

certbot -d onedayxyy.cn -d *.onedayxyy.cn  --manual --config-dir config --work-dir work --logs-dir logs --preferred-challenges dns certonly

image-20240803100103524

bash
[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个证书进行替换,测试:

image-20240803100317552

重启nginx:

nginx -s reload

🍊验证:(完美)

https://onedayxyy.cn/

image-20240803100518511

https://wiki.onedayxyy.cn/

image-20240803100457546

案例:通配符证书的概念

问题:

我的域名是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泛域名通配符证书一年及补全检查证书链完整性

https://i4t.com/6054.html

案例:cfgssl/openssl和cerbot签发方式的区别

利用 cfsslopensslcertbot 生成的 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 对证书申请有频率限制(例如,每个域名每周最多申请一定数量的证书)。

主要区别总结:

  1. 使用场景

    • certbot:主要用于快速获取和自动续期公共信任的 SSL/TLS 证书,适合需要快速部署 HTTPS 并保持证书自动更新的用户。
    • cfsslopenssl:适用于需要更高灵活性和定制化的场景,包括自签名证书、内部 CA 管理等。
  2. 操作复杂度

    • certbot:操作简单,非常适合新手和不需要复杂定制的用户。
    • cfsslopenssl:功能强大但操作相对复杂,适合有一定技术背景和定制需求的用户。
  3. 自动化

    • certbot:内置自动续期功能,适合需要长期维护的互联网业务。
    • cfsslopenssl:需要自行编写脚本或工具来实现自动化管理。
  4. 证书类型

    • certbot:主要用于获取 Let's Encrypt 提供的公共信任证书。
    • cfsslopenssl可以用于生成自签名证书和内部 CA 签发的证书。

🍊综合来说:

如果你的需求是为公开访问的网站快速、自动化地获取和管理 HTTPS 证书,certbot 是首选工具;

而如果你需要更高的灵活性和定制化,特别是生成自签名证书或管理内部 CA,cfsslopenssl 会是更好的选择。

总结

通过 Certbot 和阿里云 DNS 的集成,我们可以轻松实现 SSL 证书的自动续期。只需设置一次 cron 任务,Certbot 就会在证书到期前自动续期,并调用 alidns 脚本处理 DNS 挑战。

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 个人网站

image-20250109220325748

🍀 微信二维码

x2675263825 (舍得), qq:2675263825。

image-20230107215114763

🍀 微信公众号

《云原生架构师实战》

image-20230107215126971

🍀 csdn

https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

image-20230107215149885

🍀 知乎

https://www.zhihu.com/people/foryouone

image-20230107215203185

最后

好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!

最近更新