我们使用2009年1月7日的Postfix 2.9.4和OpenSSL 0.9.8j-fips(SLES11 SP4)。
发送邮件到特定的收件人时收到此错误消息:
error:1408D13A:SSL routines:SSL3_GET_KEY_EXCHANGE:unable to find ecdh parameters:s3_clnt.c:1336
在s3_clnt.c中读取我们的OpenSSL版本的代码,它在评论中说
现在我们只支持命名(不是通用)曲线,在这种情况下ECParameters只有三个字节。
分析代码时,这可能不是指定的曲线types,或者参数超出范围。
我的问题是:我如何教我们的SMTP客户端(或接收服务器)忽略此密码/密码套件或参数设置?
每个域的TLS策略
您可以使用Postfix TLS策略映射来创build一个域列表以及对其应用的TLS策略。
您也可以在后缀中更改您的全局smtp和smtpd选项,以限制可能或必须使用的密码。
在这种情况下的另一个select是指定在TLS中使用的密码, 在Postfix和perhaqps中使用TLS Forward Secrecy 。
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
然后创build地图:
postmap tls_policy
在/etc/postfix/main.cf你需要:
smtp_tls_policy_maps = hash:/etc/postfix/tls_policy
在/etc/postfix/main.cf您可以尝试使用smtpd_tls_exclude_ciphers和smtpd_tls_mandatory_exclude_ciphers排除密码和/或设置smtpd_tls_eecdh_grade = strong
如果调整密码排除或设置tls_policy没有帮助,那么您可能需要考虑更新openssl和postfix。
仅为一个收件人定义特定密码列表的解决scheme:
master.cf:smtp2 smtp2 unix - - n - - smtp -o tls_high_cipherlist=!ECDH:...(some more)
transport_map: <domain> smtp2:<domain> (第二个域可省略?)
tls_policy_map: <domain> verify match=hostname ciphers=high
这忽略了有问题的ECDHalgorithm,并在这个szenario中工作。
您可以使用后缀传输映射通过master.cf定义的另一个服务为特定目标路由邮件。 在那里,你应该能够使用通常的TLSconfiguration选项来启用/禁用密码。
一个更简单的方法来解决这个问题(而不是为smtp引入一个新的master.cf条目)是使用tls_policy map和set
tls_policy: <domain> verify hostname=<hostname> exclude=kECDH
而已。
如果你没有tls_policy(在旧版本的postfix中),你可以使用参数
-o smtp_tls_mandatory_exclude_ciphers=kECDH
在这个域的master.cf条目中。
感谢所有贡献者,他们让我find了正确的方法;-)