来自 Let's Encrypt (Certbot) 的附加 RSA 证书

来自 Let's Encrypt (Certbot) 的附加 RSA 证书

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_filesmtpd_tls_eccert_filesmtpd_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

相关内容