Let's Encrypt 已开始默认颁发 ECC 证书自 Certbot 2.0 起。这对于现代网络浏览器来说不是问题,但 Let's Encrypt 证书也可以用于 HTTPS 以外的其他目的。也就是说,一些 SMTP 服务器尚不支持 ECC 证书。如果此类服务器尝试STARTTLS
与使用 ECC 证书的 Postfix 建立连接,则会失败。
日志表明没有共享密码,尽管如此,例如,Wireshark 显示 TLS 握手中的客户端 Hello 显然具有与通过配置的列表相同的密码smtpd_tls_mandatory_ciphers = medium
。
postfix/smtpd[1337]: connect from mail.example.net[198.51.100.1]
postfix/smtpd[1337]: SSL_accept error from mail.example.net[198.51.100.1]: -1
postfix/smtpd[1337]: warning: TLS library problem: error:0A0000C1:SSL routines::no shared cipher:../ssl/statem/statem_srvr.c:2220:
postfix/smtpd[1337]: lost connection after STARTTLS from mail.example.net[198.51.100.1]
postfix/smtpd[1337]: disconnect from mail.example.net[198.51.100.1] ehlo=1 starttls=0/1 commands=1/2
问题是由证书类型引起的。是否可以使用 Certbot 从 Let's Encrypt 获取 ECC 和 RSA 证书?如何配置 Postfix 以同时使用它们?
答案1
来自 Let's Encrypt (Certbot) 的附加 RSA 证书
有些答案的解决方案需要自定义脚本。此解决方案完全依赖于 Certbot 配置。做出以下假设。如果您的设置与这些不同,请根据您的需要更改说明。
有一个 ECC 证书配置为其
mail.example.com
作为证书名称(--cert-name
);在/etc/letsencrypt/renewal/mail.example.com.conf
等等中配置了续订。Certbot 的默认配置是通过配置文件
/etc/letsencrypt/cli.ini
。此示例使用具有更强secp384r1
曲线(默认secp256r1
)和更大 RSA 密钥大小4096
(默认2048
)的 ECC 证书以及预配置的验证器。# Because we are using logrotate for greater flexibility, disable the # internal certbot logrotation. max-log-backups = 0 # Use ECC for the private key # (do not set this by default to allow overrides in renewal/*.conf) #key-type = ecdsa elliptic-curve = secp384r1 # Use a 4096 bit RSA key instead of 2048 rsa-key-size = 4096 # Use webroot authenticator; common webroot for all sites authenticator = webroot webroot-path = /var/www/letsencrypt
关键是不要设置
key-type
,因为它将覆盖设置的/etc/letsencrypt/renewal/*.conf
。因此,该行被注释掉。
这样,您现在可以获得两个单独的证书:
ECDSA(仅当您还没有时):
sudo certbot certonly \ --cert-name mail.example.com-ecdsa \ -d mail.example.com \ --key-type ecdsa
RSA:
sudo certbot certonly \ --cert-name mail.example.com-rsa \ -d mail.example.com \ --key-type rsa
如果您的续订方法配置正确,您应该会得到:
Requesting a certificate for mail.example.com
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/mail.example.com-ecdsa/fullchain.pem
Key is saved at: /etc/letsencrypt/live/mail.example.com-ecdsa/privkey.pem
&
Requesting a certificate for mail.example.com
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/mail.example.com-rsa/fullchain.pem
Key is saved at: /etc/letsencrypt/live/mail.example.com-rsa/privkey.pem
您将需要 Postfix 配置中的这些路径。
Postfix 中的多个证书
和Postfix TLS 支持您可以同时配置多个证书。自 Postfix 3.4 以来,建议使用smtpd_tls_chain_files
参数(而不是RSA 的传统smtpd_tls_cert_file
&和ECDSA 的& )。smtpd_tls_key_file
smtpd_tls_eccert_file
smtpd_tls_eckey_file
值得注意的是:
您还可以将密钥与其证书分开存储,同样前提是每个密钥都列在相应的证书链之前。不建议将密钥及其关联的证书链存储在单独的文件中,因为这在密钥轮换期间容易出现竞争条件,因为无法以原子方式更新多个文件。
然而,
- Certbot 将密钥和链存储在单独的文件中。
- 您可以配置一个在成功续订时
--deploy-hook
运行的脚本。systemctl reload postfix
示例配置为main.cf
;注意正确的顺序:每个证书链之前的每个私钥:
smtpd_tls_chain_files =
/etc/letsencrypt/live/mail.example.com-ecdsa/privkey.pem,
/etc/letsencrypt/live/mail.example.com-ecdsa/fullchain.pem,
/etc/letsencrypt/live/mail.example.com-rsa/privkey.pem,
/etc/letsencrypt/live/mail.example.com-rsa/fullchain.pem