Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 观察到与SSL连接的EIDOSSLConnector错误-EOF_Macos_Delphi_Openssl_Indy_Lazarus - Fatal编程技术网

Macos 观察到与SSL连接的EIDOSSLConnector错误-EOF

Macos 观察到与SSL连接的EIDOSSLConnector错误-EOF,macos,delphi,openssl,indy,lazarus,Macos,Delphi,Openssl,Indy,Lazarus,我的平台是这个 约塞米蒂操作系统10.10.5 最新的Indy(10.6.2.0,2016年3月13日下载-Indy10_5346.zip) 拉撒路1.4.4 关于OpenSSL版本,我尝试过: HomeBrew OpenSSL的安装方式如下:“brew安装OpenSSL --“普遍的” 在/usr/lib中提供的内置(0.9.8)OS X/ 我得到一个错误: 观察到与SSL-EOF连接时出现EIDOSSLConnecerr错误 违反协议 第19418行的Protocols/IdSSLO

我的平台是这个

  • 约塞米蒂操作系统10.10.5
  • 最新的Indy(10.6.2.0,2016年3月13日下载-Indy10_5346.zip)
  • 拉撒路1.4.4
关于OpenSSL版本,我尝试过:

  • HomeBrew OpenSSL的安装方式如下:“brew安装OpenSSL --“普遍的”
  • 在/usr/lib中提供的内置(0.9.8)OS X/
我得到一个错误:

观察到与SSL-EOF连接时出现EIDOSSLConnecerr错误 违反协议

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

然而,当我使用最新的东西时,为什么我会出现这个错误

(在调用OpenIncodedConnection时发生)

下面是我如何设置Indy HTTP客户端OpenSSL处理程序的:

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

EOF表示连接意外关闭,在本例中是在握手过程中。您正在启用多个SSLVersion,这意味着Indy将在内部使用SSLv23进行连接。只有当服务器使用SSLv23侦听,从而允许客户端和服务器协商兼容的SSL/TLS版本时,这才有效。如果服务器使用特定的SSL/TLS版本而不是SSLv23,则SSLv23将无法在客户端工作。您必须在客户端使用相同的特定SSL/TLS版本进行匹配。

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

经过分析,最终确定问题是由于超时(以毫秒为单位),而不是秒。一旦修复,问题就自行解决了


看看Remy Lebeau在这里给出的答案-我会试试(谢谢!)我还会发布更多的代码到目前为止没有运气。。。我相信我现在使用了所有推荐的设置
FIOHandlerOpenSSL.SSLOptions.SSLVersions[sslvSSLv23,sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2]
不是有效的代码语法。您需要
:=
运算符。并且不要指定
sslvSSLv23
FIOHandlerOpenSSL.SSLOptions.SSLVersions:=[sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2]
SSLv23是OpenSSL API中的通配符,它不是通过线路发送的实际协议版本。它是一种包含其他版本并提供在线版本协商的机制。如果服务器端未使用SSLv23,则无法与客户端协商版本。客户端需要匹配其
sslversion
设置,以匹配服务器实际使用的内容。然后我将分别尝试所有设置。这是否意味着我应该编写代码,自动尝试所有这些功能?还是有更好的办法?我将运行一些实验并报告backsslvTLSv1_2单独工作-我将很快接受答案-谢谢!首先尝试FIOHandlerOpenSSL.SSLOptions.SSLVersions:=[sslvSSLv23]是否足够,然后如果失败,尝试FIOHandlerOpenSSL.SSLOptions.SSLVersions:=[sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2]在这种情况下不会有任何区别。如果您自己指定
SSLv23
,IOHandler将使用SSLv23 API并启用所有支持的SSL/TLS版本。如果省略SSLv23,但仍指定多个SSL/TLS版本,IOHandler仍将使用SSLv23 API,但仅启用指定的版本。如果您自己指定任何一个特定的SSL/TLS版本,IOHandler将使用该版本的特定API。因此,您必须小心如何配置
SSLVersions
,您需要知道服务器真正期望的是什么-特定版本或版本协商。若要在不知道多个服务器的配置时支持多个服务器,您可能需要尝试连接几次。连接
[tlsv1,tlsv1\u 1,tlsv1\u 2]
,如果失败,则只连接
[tlsv1\u 2]
,然后只连接
[tlsv1\u 1]
,依此类推。