Ubuntu 23.10环境下Certbot无法获取基于ISRG Root X2的P384r1专属证书链问题求助
我来帮你分析下你遇到的这个问题:你想要获取完全基于P384r1 ECDSA算法的证书链(以ISRG Root X2为根),但Certbot返回了默认的RSA链,这主要是Let's Encrypt的链默认策略和Certbot链匹配逻辑的问题导致的。
问题原因拆解
- Let's Encrypt目前针对ECDSA证书,默认仍然优先返回基于ISRG Root X1的RSA中间链(R3),而你需要的**基于ISRG Root X2的ECDSA中间链(E1)**属于非默认选项,必须显式指定才能获取。
- 你使用的
--preferred-chain 'ISRG Root X2'可能因为链匹配的精确性问题失效了:Certbot在匹配链时,需要精确对应CA返回的链中某个证书的主题名称,有时候直接指定根证书名称可能不如指定中间证书名称可靠。
具体解决步骤
1. 先确认CA返回的可用链信息
先运行一个模拟申请命令,查看Let's Encrypt实际返回的链选项,这样能明确我们要指定的链名称:
certbot certonly -v --dry-run --key-type ecdsa --elliptic-curve secp384r1 -d <你的域名> --server https://acme-v02.api.letsencrypt.org/directory
在输出日志里,你会找到类似Available certificate chains的部分,里面会列出所有可选链的证书信息,重点看是否包含以ISRG Root X2为根的链,以及对应的中间证书名称(应该是E1,主题为CN=E1,O=Let's Encrypt,C=US)。
2. 调整--preferred-chain参数为中间证书名称
把原来指定根证书的参数改成指定中间证书E1,这样Certbot能更精准地匹配到我们需要的ECDSA链:
certbot certonly -v \ -a apache -i None \ --cert-name <my-cert-name> \ -d <my-domain> \ --deploy-hook '<reload-command-here>' \ --key-type ecdsa --elliptic-curve secp384r1 \ --preferred-chain 'E1'
因为E1本身就是由ISRG Root X2签名的ECDSA证书,这样最终得到的链就是:你的P384r1订阅者证书 → E1中间证书 → ISRG Root X2根证书,完全符合你的需求。
3. (可选)更新Certbot到最新版本
虽然你用的2.1.0版本不算太旧,但新版本的Certbot对链匹配逻辑有优化,可能能避免一些名称匹配的问题。在Ubuntu 23.10上可以通过官方PPA更新:
sudo add-apt-repository ppa:certbot/certbot sudo apt update sudo apt upgrade certbot
4. 验证最终的证书链
申请完成后,用以下命令检查证书链的细节,确认所有证书都是ECDSA P384r1类型:
# 检查订阅者证书 openssl x509 -in /etc/letsencrypt/live/<my-cert-name>/cert.pem -text -noout | grep -E "Public Key Algorithm|Signature Algorithm" # 检查中间证书链 openssl x509 -in /etc/letsencrypt/live/<my-cert-name>/chain.pem -text -noout | grep -E "Public Key Algorithm|Signature Algorithm|Issuer|Subject"
正常情况下,你会看到所有证书的Public Key Algorithm都是id-ecPublicKey,Signature Algorithm都是ecdsa-with-SHA384,且根证书的Subject是CN=ISRG Root X2,O=Internet Security Research Group,C=US。
备注:内容来源于stack exchange,提问作者user2690527

