快捷菜单
常用功能一站直达
更多功能请点顶栏「快捷菜单」

参考《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 记录,验证完成后再删除此记录。
AccessKey ID 和 AccessKey Secret),用于操作阿里云 DNS 服务。获取阿里云访问密钥(AccessKey ID 和 AccessKey Secret) 请参考官方文档:https://help.aliyun.com/zh/acr/create-and-obtain-an-accesskey-pair🍊环境
🍊源码
通过网盘分享的文件: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后, 访问者输入这两个域名时就可以实现访问。

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 的特点
免费:
自动化:
certbot)自动获得和更新证书,而不需要手动干预。开放:
简化:
安全性:
🍊Let’s Encrypt 的背景和目标
Let’s Encrypt 由多个知名组织和公司支持,包括 Mozilla、思科、Akamai、电子前哨基金会(EFF)等。其主要目标是:
综上,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
(3)Cloudflare
1# 1. 安装 EPEL 源
2sudo yum install -y epel-release
3
4# 2. 安装并启用 Snapd
5sudo yum install -y snapd
6sudo systemctl enable --now snapd.socket
7sudo ln -s /var/lib/snapd/snap /snap
8
9## !! 本次忽略,未执行次命令
10# 3. 重启/重新登录(确保路径生效)
11# 或直接执行:
12#sudo reboot
13
14## !! 本次忽略,未执行次命令
15# 4. 安装并更新 Snap Core
16#sudo snap install core
17#sudo snap refresh core
18
19# 5. 安装 Certbot
20sudo snap install --classic certbot
21sudo ln -s /snap/bin/certbot /usr/bin/certbot
22
23# 6. 验证安装
24certbot --version🍊 (1)安装 aliyun cli 工具
1wget https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tgz
2tar xzvf aliyun-cli-linux-latest-amd64.tgz
3sudo cp aliyun /usr/local/bin
4rm -f aliyun验证 aliyun cli 工具是否成功:
打开终端,输入 aliyun 命令并回车。如果安装成功,会显示阿里云 CLI 的帮助信息,包含可用的命令和选项
示例输出如下:

🍊 (2)安装 certbot-dns-aliyun 插件
1#下载、部署并配置一个名为 alidns.sh 的脚本
2wget https://file.onedayxyy.cn/script/alidns.sh
3sudo cp alidns.sh /usr/local/bin
4sudo chmod +x /usr/local/bin/alidns.sh
5sudo ln -s /usr/local/bin/alidns.sh /usr/local/bin/alidns如果下载失败手动前往 github 下载:https://github.com/justjavac/certbot-dns-aliyun/blob/main/alidns.sh
安装完成后,你需要对阿里云 CLI 进行配置,使其能够访问你的阿里云账户。可以使用以下命令进行配置:
1aliyun configure set --profile AkProfile --mode AK --access-key-id 替换为你自己的真实 AccessKey ID --access-key-secret 替换为你自己的真实 AccessKey Secret --region 替换为你希望使用的阿里云地域的 ID#示例命令
1aliyun configure set --profile AkProfile --mode AK --access-key-id LTAI5123456nqCY --access-key-secret mED1234560tBw --region cn-shanghai
2#这里秘钥我加过密的哦按照提示输入你的阿里云访问密钥(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

🍊 验证配置
配置完成后,你可以使用以下命令来验证配置是否生效:
1aliyun configure list输出:
1[root@blog ~]# aliyun configure list
2Profile | Credential | Valid | Region | Language
3--------- | ------------------ | ------- | ---------------- | --------
4default | | Invalid | | en
5AkProfile * | AK:***jAc | Valid | oss-cn-shanghai | en
6
7#目前存在两个配置文件,分别是 default 和 AkProfile。其中 AkProfile 后面带有 * 号,这表明当前使用的默认配置文件是 AkProfile。🍊 配置日志文件
1sudo touch /var/log/certbot-renew.log
2sudo chmod 644 /var/log/certbot-renew.log测试是否能正确申请:
警告
.onedayxyy.cn 请换成自己的主域名
1certbot certonly -d onedayxyy.cn -d *.onedayxyy.cn --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean" --dry-run 1#输出
2[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
3Saving debug log to /var/log/letsencrypt/letsencrypt.log
4Simulating a certificate request for *.onedayxyy.cn
5Hook '--manual-auth-hook' for onedayxyy.cn ran with output:
6 {
7 "RecordId": "189619603129344",
8 "RequestId": "572026AD-B305831B4ABE"
9 }
10Hook '--manual-cleanup-hook' for onedayxyy.cn ran with output:
11 {
12 "RecordId": "18961344",
13 "RequestId": "8B219E945642"
14 }
15The dry run was successful.
16#看到"The dry run was successful."模拟成功!正式申请时去掉 --dry-run 参数:
1certbot certonly -d onedayxyy.cn -d *.onedayxyy.cn --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean" 输出:
1[root@blog ~]# certbot certonly -d onedayxyy.cn -d *.onedayxyy.cn --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean"
2Saving debug log to /var/log/letsencrypt/letsencrypt.log
3Requesting a certificate for *.onedayxyy.cn
4Hook '--manual-auth-hook' for onedayxyy.cn ran with output:
5 {
6 "RecordId": "189619072",
7 "RequestId": "654E1FE97B193D5A"
8 }
9Hook '--manual-cleanup-hook' for onedayxyy.cn ran with output:
10 {
11 "RecordId": "1896643072",
12 "RequestId": "492AB-75267001AAB7"
13 }
14
15Successfully received certificate.
16Certificate is saved at: /etc/letsencrypt/live/onedayxyy.cn-0001/fullchain.pem
17Key is saved at: /etc/letsencrypt/live/onedayxyy.cn-0001/privkey.pem
18This certificate expires on 2025-05-31.
19These files will be updated when the certificate renews.
20Certbot has set up a scheduled task to automatically renew this certificate in the background.
21
22- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
23If you like Certbot, please consider supporting our work by:
24 * Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
25 * Donating to EFF: https://eff.org/donate-le
26- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -参数说明
查看下证书:
1Certificate is saved at: /etc/letsencrypt/live/onedayxyy.cn-0001/fullchain.pem
2Key is saved at: /etc/letsencrypt/live/onedayxyy.cn-0001/privkey.pem
3
4
5[root@blog ~]# ll /etc/letsencrypt/live/onedayxyy.cn-0001/fullchain.pem
6lrwxrwxrwx 1 root root 46 Mar 2 21:55 /etc/letsencrypt/live/onedayxyy.cn-0001/fullchain.pem -> ../../archive/onedayxyy.cn-0001/fullchain1.pem
7[root@blog ~]# ll /etc/letsencrypt/live/onedayxyy.cn-0001/privkey.pem
8lrwxrwxrwx 1 root root 44 Mar 2 21:55 /etc/letsencrypt/live/onedayxyy.cn-0001/privkey.pem -> ../../archive/onedayxyy.cn-0001/privkey1.pem
9[root@blog ~]# 将上面获取到的证书配置到自己的nginx:(如果有cdn也需要配置到cdn里哦)
vim /etc/nginx/conf.d/wiki.onedayxyy.cn.conf
详情
1nginx -s reload1cat /etc/letsencrypt/live/onedayxyy.cn-0001/fullchain.pem
2cat /etc/letsencrypt/live/onedayxyy.cn-0001/privkey.pem拷贝证书的公钥和私钥内容到cdn配置里:

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


1certbot renew --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean" --dry-run如果以上命令没有错误,把 --dry-run 参数去掉。
1certbot renew --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean"🍊 检查证书状态
运行以下命令查看证书的到期时间:
1certbot certificates输出:
1[root@blog ~]# certbot certificates
2Saving debug log to /var/log/letsencrypt/letsencrypt.log
3Renewal 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.
4Renewal 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.
5
6- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
7Found the following certs:
8 Certificate Name: onedayxyy.cn-0001
9 Serial Number: 3b19b47d3bf12688b69a9189e9da78cc117
10 Key Type: ECDSA
11 Domains: *.onedayxyy.cn
12 Expiry Date: 2025-05-31 12:57:22+00:00 (VALID: 89 days)
13 Certificate Path: /etc/letsencrypt/live/onedayxyy.cn-0001/fullchain.pem
14 Private Key Path: /etc/letsencrypt/live/onedayxyy.cn-0001/privkey.pem
15
16The following renewal configurations were invalid:
17 /etc/letsencrypt/renewal/onedayxyy.cn.conf
18 /etc/letsencrypt/renewal/wiki.onedayxyy.cn.conf
19- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
20[root@blog ~]# 添加定时任务 crontab。
1crontab -e然后添加以下配置:
11 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。
没有日志输出,如果 /var/log/certbot-renew.log 没有日志输出,可能是以下原因: 权限问题:确保日志文件可写:
:::warning
这里需要执行下这2行命令的,否则没这个日志文件;
:::
1sudo touch /var/log/certbot-renew.log
2sudo chmod 644 /var/log/certbot-renew.log检查 cron 日志:
1grep CRON /var/log/syslog如果证书未到期,Certbot 会跳过续期。可以通过以下命令强制续期:
1certbot renew --force-renewal --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean"(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 支持的地域信息
详情
警告
Let’s Encrypt 对通配符域名的验证要求使用 DNS 验证(
dns-01),而不是 HTTP 验证(http-01) ;(即http获取证书方式不支持泛域名证书生成)因此,推荐使用dns方式来生成泛域名证书;
问题: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 重新申请证书,并在命令中明确指定主域名和泛域名。例如:
1sudo certbot certonly --manual -d onedayxyy.cn -d *.onedayxyy.cn这样,Certbot 会生成一个包含主域名 onedayxyy.cn 和泛域名 *.onedayxyy.cn 的证书。
配置 Nginx: 确保你的 Nginx 配置文件中正确引用了新生成的证书。例如:
1server {
2 listen 443 ssl;
3 server_name onedayxyy.cn;
4
5 ssl_certificate /etc/letsencrypt/live/onedayxyy.cn/fullchain.pem;
6 ssl_certificate_key /etc/letsencrypt/live/onedayxyy.cn/privkey.pem;
7
8 # 其他配置...
9}
10
11server {
12 listen 443 ssl;
13 server_name wiki.onedayxyy.cn;
14
15 ssl_certificate /etc/letsencrypt/live/onedayxyy.cn/fullchain.pem;
16 ssl_certificate_key /etc/letsencrypt/live/onedayxyy.cn/privkey.pem;
17
18 # 其他配置...
19}验证和重新加载 Nginx: 在修改配置文件后,使用以下命令测试配置文件的语法是否正确:
1sudo nginx -t如果测试通过,使用以下命令重新加载 Nginx 配置:
1sudo systemctl reload nginx通过以上步骤,你应该能够确保主域名 onedayxyy.cn 和泛域名 *.onedayxyy.cn 都能使用安全的证书。
🍊自己重新再测试:
1#有问题版
2certbot -d *.onedayxyy.cn --manual --config-dir config --work-dir work --logs-dir logs --preferred-challenges dns certonly
3
4#gpt回答版
5sudo certbot certonly --manual -d onedayxyy.cn -d *.onedayxyy.cn
6
7
8#正确版
9certbot -d onedayxyy.cn -d *.onedayxyy.cn --manual --config-dir config --work-dir work --logs-dir logs --preferred-challenges dns certonly之前生成的:

先删除目录,再进行测试:
1rm -rf config/
2
3certbot -d onedayxyy.cn -d *.onedayxyy.cn --manual --config-dir config --work-dir work --logs-dir logs --preferred-challenges dns certonly
1[root@ruyub-blog-prod onedayxyy.cn]# pwd
2/root/config/archive/onedayxyy.cn
3[root@ruyub-blog-prod onedayxyy.cn]# ll
4total 16
5-rw-r--r-- 1 root root 1289 Aug 3 10:00 cert1.pem
6-rw-r--r-- 1 root root 1566 Aug 3 10:00 chain1.pem
7-rw-r--r-- 1 root root 2855 Aug 3 10:00 fullchain1.pem
8-rw------- 1 root root 241 Aug 3 10:00 privkey1.pem
9[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单独申请一个新的证书。
30元实现AlphaSSL泛域名通配符证书一年及补全检查证书链完整性(收藏)
30元实现AlphaSSL泛域名通配符证书一年及补全检查证书链完整性


利用 cfssl、openssl 和 certbot 生成的 HTTPS 证书在安全性和功能上没有本质的区别,但它们在使用和管理上的细节有所不同。下面是对这几种工具的简单比较:
1.cfssl(Cloudflare’s PKI/TLS toolkit)
优点:
cfssl 提供了一整套工具,用于生成和管理证书,包括生成证书请求(CSR)、签发证书、验证证书链等等。缺点:
2.openssl
优点:
openssl 是一个非常强大的工具,几乎可以在任何操作系统上使用。缺点:
3.certbot(==Let’s Encrypt 的官方客户端==)
优点:
certbot 提供免费的 SSL/TLS 证书,并且可以自动化证书的获取和续期。缺点:
certbot 主要申请的是 Let’s Encrypt 提供的公共信任的证书,不能生成内部使用的自签名证书。主要区别总结:
使用场景:
操作复杂度:
自动化:
证书类型:
🍊综合来说:
如果你的需求是为公开访问的网站快速、自动化地获取和管理 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

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

日历 · 精选 · 友链 · 更多
如果内容对你有帮助,欢迎请我喝杯咖啡 ☕



One的公众号
爱折腾博客的小白