【问题标题】:EIdOSSLConnectError Error connecting with SSL - EOF was observedEIdOSSLConnectError 连接 SSL 时出错 - 观察到 EOF
【发布时间】:2016-03-14 12:23:36
【问题描述】:

我的平台是这个

  • OS X Yosemite 10.10.5
  • 最新的 Indy(10.6.2.0,2016 年 3 月 13 日下载 - Indy10_5346.zip)
  • 拉撒路 1.4.4

关于我尝试过的 OpenSSL 版本:

  • HomeBrew OpenSSL 安装如下:"brew install openssl --通用”
  • /usr/lib/ 中提供的内置 (0.9.8) OS X

我收到错误:

EIdOSSLConnecError 连接 SSL 时出错 - 观察到 EOF 违反协议

在文件 Protocols/IdSSLOpenSSLHeaders.pas 的第 19418 行

但是,由于我使用的是最新版本 - 为什么会出现此错误?

(在调用 OpenEncodedConnection 时发生)

以下是我设置 Indy HTTP 客户端 OpenSSL 处理程序的方法:

FIOHandlerOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create;
FIOHandlerOpenSSL.SSLOptions.SSLVersions := [sslvSSLv23,sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2]
FIOHandlerOpenSSL.Mode := sslmClient;
FIOHandlerOpenSSL.VerifyMode := [];
FIOHandlerOpenSSL.VerifyDepth := 0;

【问题讨论】:

  • 看看 Remy Lebeau 在这里给出的答案 - forums.embarcadero.com/message.jspa?messageID=682440
  • 会尝试(谢谢!)我还会发布更多代码
  • 到目前为止没有运气...我相信我现在使用了所有推荐的设置
  • FIOHandlerOpenSSL.SSLOptions.SSLVersions[sslvSSLv23,sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2] 不是有效的代码语法。您需要 := 运算符。并且不要指定sslvSSLv23:FIOHandlerOpenSSL.SSLOptions.SSLVersions := [sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2]
  • SSLv23 是 OpenSSL API 中的通配符,它​​不是通过网络发送的实际协议版本。它是一种包含其他版本并通过网络提供版本协商的机制。如果服务器端未使用 SSLv23,则无法与客户端协商版本。客户端需要匹配其SSLVersions 设置以匹配服务器实际使用的内容。

标签: macos delphi openssl indy lazarus


【解决方案1】:

EOF 表示连接意外关闭,在这种情况下是在握手期间。您启用了多个 SSLVersions,这意味着 Indy 将在内部使用 SSLv23 进行连接。这仅在服务器使用 SSLv23 进行侦听时才有效,从而允许客户端和服务器协商兼容的 SSL/TLS 版本。如果服务器使用特定的 SSL/TLS 版本而不是 SSLv23,则 SSLv23 将无法在客户端运行。您必须在客户端使用相同的特定 SSL/TLS 版本才能匹配。

【讨论】:

  • 我会分别尝试它们。这是否意味着我应该编写自动尝试所有这些的代码?或者,还有更好的方法?我会进行一些实验并报告
  • sslvTLSv1_2 单独工作 - 我会尽快接受答案 - 谢谢!
  • 首先尝试使用 FIOHandlerOpenSSL.SSLOptions.SSLVersions := [sslvSSLv23] 是否足够,然后如果帽子失败尝试使用 FIOHandlerOpenSSL.SSLOptions.SSLVersions := [sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2]
  • 在这种情况下不会有任何区别。如果您自己指定sslvSSLv23,IOHandler 将使用 SSLv23 API 并启用所有受支持的 SSL/TLS 版本。如果您省略 sslvSSLv23 但仍指定多个 SSL/TLS 版本,则 IOHandler 仍将使用 SSLv23 API 但仅启用指定的版本。如果您自己指定任何一个特定的 SSL/TLS 版本,IOHandler 将使用该版本的特定 API。所以,你必须小心你如何配置SSLVersions,你需要知道服务器真正期待什么——一个特定的版本,或者版本协商。
  • 要在不知道配置的情况下支持多台服务器,您可能需要尝试连接多次。连接[tlsv1,tlsv1_1,tlsv1_2],如果失败则只连接[tlsv1_2],然后只连接[tlsv1_1],依此类推。
【解决方案2】:

此问题的另一个原因可能是超时。

经过分析,最终确定问题是由于以毫秒为单位的超时,而不是秒。解决后,问题就自行解决了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 2018-11-24
    相关资源
    最近更新 更多