【问题标题】:Perl LWP GET or POST to an SNI SSL URLPerl LWP GET 或 POST 到 SNI SSL URL
【发布时间】:2014-08-27 17:18:12
【问题描述】:

我有一个使用 perl LWP 向客户发送数据的系统。他们可以选择自己的 URL 以及是 POST 还是 GET。

一位新客户最近抱怨该服务无法正常工作,他们怀疑这是因为他们的端点使用了 SNI SSL。

查看日志,我看到的只是错误消息“(证书验证失败)(500 读取超时)”。

有什么方法可以判断这个问题是因为他们的 SNI SSL 还是其他原因?我想我可以通过关闭verify_hostname来解决问题,但这是不得已而为之,我宁愿让它正常工作。

我还应该采取哪些其他步骤?

【问题讨论】:

  • “我想我可以通过关闭 verify_hostname 来解决问题...” - 不要这样做。这叫杀死病人。治愈比疾病更糟糕。
  • “查看日志,我看到的只是错误消息“(证书验证失败)(500 读取超时)” - 我们需要更多信息。请提供服务器的 URL 或服务器的证书。最好粘贴 openssl s_client -connect <server>:<port> 的完整输出。您还应该提供您的代码。
  • @jww - 我同意 verify_hostname (因此这是最后的手段)。最后通过升级 IO::Socket::SSL 解决了这个问题。谢谢!

标签: perl ssl lwp


【解决方案1】:

SNI 是否有问题取决于您使用的模块及其版本:

  • LWP 从 6.0 版开始使用 IO::Socket::SSL 作为后端 SSL 库。在此之前,它使用不支持 SNI 的 Crypt::SSLeay,您仍然可以强制使用 Crypt::SSLeay。但是,虽然这可能会导致服务器返回错误的数据,但在大多数情况下不会导致验证问题,因为 Crypt::SSLeay 不会验证证书中的名称是否与请求的主机名匹配(因此不会检测到 man-中间攻击)。
  • IO::Socket::SSL 从版本 1.56 (02/2012) 开始在客户端执行 SNI,但您至少需要 1.0 版本的 OpenSSL。由于 OpenSSL 在与某些服务器交互时存在错误,因此禁用了对旧版本的支持。

您可以尝试在运行代码时通过设置$IO::Socket::SSL::DEBUG=4 来调试问题。

【讨论】:

  • "IO::Socket::SSL 从 1.56 版开始执行 SNI" - 我认为服务器的版本是 1.83。见cpansearch.perl.org/src/SULLR/IO-Socket-SSL-1.83/Changes
  • 是的,但我们谈论的是 LWP,这意味着客户端。在这方面我已经把我的回答说得更清楚了。
  • 我使用的是 IO::Socket::SSL 1.53 版。升级好像解决了。谢谢!
猜你喜欢
  • 2012-06-10
  • 1970-01-01
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多