openssl 更新 1.0.1f 至 1.0.1g 导致 sendmail 中断(SSL23_GET_SERVER_HELLO:tlsv1 警报解码错误)

openssl 更新 1.0.1f 至 1.0.1g 导致 sendmail 中断(SSL23_GET_SERVER_HELLO:tlsv1 警报解码错误)

两天前,我将 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,队列中的邮件就顺利发出了。我希望我没有因此引发新的问题。

答案2

是的,有两种解决方案:

  • 使用 SSLv3
  • 编译时无需

    /* #define TLSEXT_TYPE_padding 21 */
    

参考这里

相关内容