我们使用 Postfix 2.9.4 和 OpenSSL 0.9.8j-fips 2009 年 1 月 7 日(SLES11 SP4)。
我们在向特定收件人发送邮件时收到此错误消息:
error:1408D13A:SSL routines:SSL3_GET_KEY_EXCHANGE:unable to find ecdh parameters:s3_clnt.c:1336
阅读我们 OpenSSL 版本的 s3_clnt.c 中的代码时,它在注释中说
目前我们只支持命名(非通用)曲线,在这种情况下 ECParameters 只有三个字节。
分析代码,这不是命名曲线类型,或者参数超出范围。
我的问题是:如何教会我们的 SMTP 客户端(或者接收服务器)省略这个密码/密码套件或参数集?
答案1
每个域的 TLS 策略
您可以使用Postfix TLS 策略图创建域名列表以及适用于它们的 TLS 策略。
您还可以更改后缀中的全局smtp
和smtpd
选项来限制可以或必须使用的密码。
在这种情况下,另一个选择是指定要使用的密码,如Postfix 中的 TLS 前向保密 也许只是使用强的。
smtpd_tls_eecdh_grade = strong | ultra
以下是一个例子/etc/postfix/tls_policy
.google.com secure match=.google.com:.gmail.com protocols=TLSv1 ciphers=high
.paypal.com secure match=.paypal.com protocols=TLSv1 ciphers=high
.example.tld ciphers=medium
.blizzard.com may
然后使用以下代码创建地图:
postmap tls_policy
您/etc/postfix/main.cf
需要:
smtp_tls_policy_maps = hash:/etc/postfix/tls_policy
您可以尝试使用and和/或 set/etc/postfix/main.cf
排除密码smtpd_tls_exclude_ciphers
smtpd_tls_mandatory_exclude_ciphers
smtpd_tls_eecdh_grade = strong
如果调整密码排除或设置 tls_policy 没有帮助,那么您可能需要考虑更新 openssl 和 postfix。
答案2
仅为一个收件人定义特定密码列表的解决方案:
master.cf:smtp2 unix - - n - - smtp -o tls_high_cipherlist=!ECDH:...(some more)
transport_map:(<domain> smtp2:<domain>
第二个域可省略?)
tls_策略图:<domain> verify match=hostname ciphers=high
这省略了有问题的 ECDH 算法并在这种情况下发挥作用。
答案3
您可以使用后缀传输图通过 中定义的另一项服务将邮件路由到特定目的地master.cf
。在那里,您应该能够使用 TLS 的常用 postfix 配置选项来启用/禁用密码。
答案4
解决这个问题的一个更简单的方法(而不是为 smtp 引入新的 master.cf 条目)是使用 tls_policy 映射并设置
tls_policy: <domain> verify hostname=<hostname> exclude=kECDH
就是这样。
如果你没有 tls_policy(在旧版本的 postfix 中),你可以使用参数
-o smtp_tls_mandatory_exclude_ciphers=kECDH
在此域的 master.cf 条目中。
感谢所有帮助我找到这个问题的贡献者 ;-)