首页 / 技术分享 / 脚本工具 /
ECS 宝塔更新 Let's Encrypt 证书失败

ECS 宝塔更新 Let's Encrypt 证书失败

码不停提

2026-07-19
12 次浏览
0 条评论

未能成功修复宝塔Let's Encrypt, 改为手动更新证书

脚本工具
SSL
acme
分享:

🚀 终极方案:直接用 acme.sh(轻量且不依赖 Python 网络)

如果 certbot 总是出现网络问题,acme.sh 是更好的选择:

# 安装 acme.sh
curl https://get.acme.sh | sh

# 使用 webroot 方式签发证书
~/.acme.sh/acme.sh --issue -d example.domain.com --webroot /www/wwwroot/example.domain.com

# 查看证书位置
~/.acme.sh/acme.sh --info -d example.domain.com

证书生成后,在宝塔面板手动导入:

  • 证书文件:/root/.acme.sh/example.domain.com/example.domain.com.cer
  • 私钥文件:/root/.acme.sh/example.domain.com/example.domain.com.key

📋 建议

  1. 优先使用正确的 certbot 命令(第一个代码块),看看是否还有网络错误
  2. 如果还是报错,直接用 acme.sh(终极方案),这个工具更轻量,受 Python 环境影响更小
  3. 如果 acme.sh 也不行,最后用宝塔面板的 【DNS 验证(手动)】 方式

先试第一个命令,告诉我结果!

如果证书不存在或已过期,重新签发

如果证书文件不存在或已经过期,执行以下命令强制重新签发:

bash

# 先注册账号(如果还没注册)
~/.acme.sh/acme.sh --register-account -m 82294148@qq.com

# 强制重新签发证书
~/.acme.sh/acme.sh --issue -d example.domain.com --webroot /www/wwwroot/example.domain.com --force

在宝塔面板中导入证书

一旦确认证书有效,在宝塔面板中导入:

  1. 宝塔面板 → 网站example.domain.com【SSL】
  2. 选择 【其他证书】
  3. 填入以下内容:

密钥(KEY):

bash

cat /root/.acme.sh/example.domain.com_ecc/example.domain.comkey

证书(PEM格式):

bash

cat /root/.acme.sh/example.domain.com_ecc/example.domain.com.cer

根证书(CA):

bash

cat /root/.acme.sh/example.domain.com_ecc/ca.cer

⚙️ 自动续期检查

确认 cron 任务已配置:

bash

crontab -l | grep acme

如果输出类似以下内容,说明自动续期已配置:

text

0 0 * * * /root/.acme.sh/acme.sh --cron --home /root/.acme.sh > /dev/null

先执行第一组命令(查看证书详情和到期时间),告诉我输出结果。如果证书有效,就直接在宝塔面板导入;如果证书有问题,我们用 --force 重新签发。

后续添加其他域名证书

 ~/.acme.sh/acme.sh --issue -d zf.rx.sc.cn --webroot /www/wwwroot/zf.rx.sc.cn --force
[Sun Jul 19 03:40:07 PM CST 2026] Using CA: https://acme.zerossl.com/v2/DV90
[Sun Jul 19 03:40:07 PM CST 2026] Creating domain key
[Sun Jul 19 03:40:07 PM CST 2026] The domain key is here: /root/.acme.sh/zf.rx.sc.cn_ecc/zf.rx.sc.cn.key
[Sun Jul 19 03:40:07 PM CST 2026] Single domain='zf.rx.sc.cn'
[Sun Jul 19 03:41:18 PM CST 2026] Getting webroot for domain='zf.rx.sc.cn'
[Sun Jul 19 03:41:18 PM CST 2026] Verifying: zf.rx.sc.cn
[Sun Jul 19 03:41:26 PM CST 2026] Processing. The CA is processing your order, please wait. (1/30)
[Sun Jul 19 03:41:36 PM CST 2026] Success
[Sun Jul 19 03:41:36 PM CST 2026] Verification finished, beginning signing.
[Sun Jul 19 03:41:36 PM CST 2026] Let's finalize the order.
[Sun Jul 19 03:41:36 PM CST 2026] Le_OrderFinalize='https://acme.zerossl.com/v2/DV90/order/XSr3EZbjd1PfqmERnhTVlg/finalize'
[Sun Jul 19 03:41:49 PM CST 2026] Order status is 'processing', let's sleep and retry.
[Sun Jul 19 03:41:49 PM CST 2026] Sleeping for 15 seconds then retrying
[Sun Jul 19 03:42:05 PM CST 2026] Polling order status: https://acme.zerossl.com/v2/DV90/order/XSr3EZbjd1PfqmERnhTVlg
[Sun Jul 19 03:42:08 PM CST 2026] Downloading cert.
[Sun Jul 19 03:42:08 PM CST 2026] Le_LinkCert='https://acme.zerossl.com/v2/DV90/cert/cz9RbbqCva5bZ4sRQva88g'
[Sun Jul 19 03:42:20 PM CST 2026] Cert success.
-----BEGIN CERTIFICATE-----
MIIDezCCAyGgAwIBAgIRAP1VHRSUqiGTd46kpzOBEk8wCgYIKoZIzj0EAwIwRjEL
MAkGA1UEBhMCQVQxFTATBgNVBAoTDFplcm9TU0wgR21iSDEgMB4GA1UEAxMXWmVy
b1NTTCBFQ0MgRFYgU1NMIENBIDIwHhcNMjYwNzE5MDAwMDAwWhcNMjYxMDE3MjM1
OTU5WjAWMRQwEgYDVQQDEwt6Zi5yeC5zYy5jbjBZMBMGByqGSM49AgEGCCqGSM49
AwEHA0IABLa+ar5GX+bWAmh1F2/dfkzrUib5oc5sabweOxO1aEE5GS1Uq1BA1sT8
jW0feL1TppGXKZbyQhtTMrY9G0uFJ9OjggIeMIICGjAfBgNVHSMEGDAWgBSURZ/a
UUdx1XOurB2rCHISba18YjAdBgNVHQ4EFgQUESizslRumEo+55fKUT0cnhfGyjMw
DgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUH
AwEwEwYDVR0gBAwwCjAIBgZngQwBAgEwbgYIKwYBBQUHAQEEYjBgMDkGCCsGAQUF
BzAChi1odHRwOi8vY3J0LnNlY3RpZ28uY29tL1plcm9TU0xFQ0NEVlNTTENBMi5j
cnQwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLnNlY3RpZ28uY29tMIIBBgYKKwYB
BAHWeQIEAgSB9wSB9ADyAHcA1219ENGn9XfCx+lf1wC/+YLJM1pl4dCzAXMXwMjF
aXcAAAGfeVMLhQAABAMASDBGAiEA57ctOhBIMGTxUDOvIALQscjSBOgj6bGUwGD+
+H68/iMCIQCCLJOUxc8U6F+O8slPPdSwqcgJ4RE7NPcYfKV84TiKmAB3AMijxH/H
s625NWsBP2p6Em3jOk5DpcZG+ZetOXWZHc+aAAABn3lTC4YAAAQDAEgwRgIhAKcW
XWub5eumO4gPdhLAGYg/XcbkJuE7teEeazGToLxLAiEA2KgNEV1kq8qm60bSCKYO
4LEEsKAEi8Shh5Nix2JjN78wFgYDVR0RBA8wDYILemYucnguc2MuY24wCgYIKoZI
zj0EAwIDSAAwRQIgIR9ptM4+IrBU6epa7Kc9ZtIyoD1W8RZ1K2Q86WaOXt4CIQDQ
x28OKl0wvBoV4890/jxfXzDIidOT3euoUv/Q9XGO1Q==
-----END CERTIFICATE-----
[Sun Jul 19 03:42:20 PM CST 2026] Your cert is in: /root/.acme.sh/zf.rx.sc.cn_ecc/zf.rx.sc.cn.cer
[Sun Jul 19 03:42:20 PM CST 2026] Your cert key is in: /root/.acme.sh/zf.rx.sc.cn_ecc/zf.rx.sc.cn.key
[Sun Jul 19 03:42:20 PM CST 2026] The intermediate CA cert is in: /root/.acme.sh/zf.rx.sc.cn_ecc/ca.cer
[Sun Jul 19 03:42:20 PM CST 2026] And the full-chain cert is in: /root/.acme.sh/zf.rx.sc.cn_ecc/fullchain.cer
^C

把 KEY 和 PEM 配置到的站点后台.

本地通过 curl -I https://your.domain.com 测试的时候, 本地电脑上测试是正常的, 然后在服务器上测试会返回 curl: (60) SSL certificate problem: unable to get local issuer certificate

解决办法:

让服务器上所有工具(包括 curl)都能正确验证证书。你需要找到 curl 默认查找的根证书文件并确保它存在且完整。

  1. 首先,检查 curl 的默认配置: bash

    curl -v https://home.git.saya.cloud 2>&1 | grep "CAfile"

    这会显示类似 CAfile: /etc/ssl/certs/ca-certificates.crt 的信息。

  2. 然后,将 acme.sh 生成的完整证书链,追加到 curl 使用的那个根证书文件里: bash

    cat /root/.acme.sh/home.git.saya.cloud_ecc/fullchain.cer >> /etc/ssl/certs/ca-certificates.crt

    重要提醒:请先备份你的 /etc/ssl/certs/ca-certificates.crt 文件,以防操作失误。

  3. 最后,再次测试: bash

    curl -I https://home.git.saya.cloud

    现在应该会成功。

PS: 服务器上如果有 Go, Python 常驻内存的程序, 需要重启进程才会生效.

评论区 (0)

你需要先 登录 后才能发表评论。
还没有人评论,赶快成为第一个吧。