两天前,我将 openssl 1.0.1f 更新到 1.0.1g。一切似乎都很好。但过了一会儿,sendmail 日志中弹出一个错误:
OpenSSL 1.0.1g 失败
4 月 10 日 10:13:45 mail sendmail[17568]: STARTTLS=client,错误:连接失败=-1,原因=tlsv1 警报解码错误,SSL_error=1,errno=0,重试=-1
4 月 10 日 10:13:45 邮件 sendmail[17568]: STARTTLS=客户端: 17568:错误:1407741A:SSL 例程:SSL23_GET_SERVER_HELLO:tlsv1 警报解码错误:s23_clnt.c:762:
4 月 10 日 10:13:45 mail sendmail[17568]: 规则集=tls_server,arg1=SOFTWARE,relay=mail.example.com,reject=403 4.7.0 TLS 握手失败。
邮件尚未送达。
OpenSSL 1.0.1f 有效
然后我降级到 1.0.1f 并且邮件已发送:
4 月 10 日 10:17:31 邮件 sendmail[31809]: STARTTLS=client,relay=mail.example.com.,version=TLSv1/SSLv3,verify=FAIL,cipher=DHE-RSA-AES256-SHA,bits=256/256
看起来这两个 openssl 版本之间除了 heartbleed 错误修复之外还有其他区别。
版本比较
然后我尝试了两个 OpenSSL 版本:
openssl s_client -starttls smtp -connect mail.example.com:25
OpenSSL 版本 1.0.1g 的输出:
已连接(00000003)
140370040759952:错误:1407741A:SSL例程:SSL23_GET_SERVER_HELLO:tlsv1警报解码错误:s23_clnt.c:762:
没有可用的对等证书
未发送客户端证书 CA 名称
SSL 握手已读取 131 个字节并写入 552 个字节
新的,(无),密码是(无)
不支持安全重新协商
压缩:无
扩展:无
OpenSSL 版本 1.0.1f 的输出(部分):
已连接(00000003)
depth=0 C = 美国、ST = 加利福尼亚、L = 圣布鲁诺、O = “IronPort Systems, Inc.”、CN = IronPort 设备演示证书
验证错误:num=20:无法获取本地颁发者证书
验证返回:1
depth=0 C = 美国、ST = 加利福尼亚、L = 圣布鲁诺、O = “IronPort Systems, Inc.”、CN = IronPort 设备演示证书
验证错误:num=21:无法验证第一个证书
验证返回:1
证书链
0 s:/C=US/ST=加利福尼亚/L=圣布鲁诺/O=IronPort Systems, Inc./CN=IronPort 设备演示证书
i:/C=US/ST=加利福尼亚/L=圣布鲁诺/O=IronPort Systems, Inc./CN=IronPort 设备演示证书
服务器证书
---剪辑---
未发送客户端证书 CA 名称
SSL 握手已读取 1771 个字节并写入 552 个字节
新的 TLSv1/SSLv3,密码为 DHE-RSA-AES256-SHA
服务器公钥为1024位
支持安全重新协商
压缩:无
扩展:无
SSL 会话:
Protocol : TLSv1 Cipher : DHE-RSA-AES256-SHA ---Snipped---
现在怎么办?
我的解释是,所提供的证书mail.example.com
不适用于生产用途......
有没有办法用 openssl 1.0.1g 处理此类证书?mail.example.com
是我遇到问题的几个通信伙伴之一。
谢谢泰迪
答案1
情况迫使我从源代码编译 openssl 1.0.1g,并且遇到了与上面报告相同的行为。这是在 64 位 Intel 上的 Fedora 18 下。与原始发帖人报告的情况一样,大多数邮件都正常发出,但一个邮件目的地遭遇了相同的 TLS 握手失败。
openssl 变更日志(简要 CL这里,详细 CL这里) 从 1.0.1f 到 1.0.1g 仅发生了三处变化:
- 安全更新
- 另一个安全更新
- 为损坏的服务器添加 TLS 填充扩展解决方法。
推测第三个变化是导致问题的原因,我注释掉了一行ssl/tls1.h
似乎可以控制这个“TLS 填充”修改如下:
/* #define TLSEXT_TYPE_padding 21 */
再次编译,将库.so
文件放到位,重新启动sendmail
,队列中的邮件就顺利发出了。我希望我没有因此引发新的问题。