我正在尝试将基于PHP SOAP的Web服务实现到我的Web应用程序中。我得到了一系列错误,这些错误似乎指向了OpenSSL(或Curl等)的库冲突,我通过在互联网上搜索类似的错误来理解这一点,但是认为库是问题的普遍共识,我找不到解决方案。
Warning (2): SoapClient::__doRequest() [soapclient.--dorequest]: SSL operation failed with code 1. OpenSSL Error messages:
error:140773F2:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert unexpected message [CORE/vendors/Startrack/WSSecurity.php, line 110]
Warning (2): SoapClient::__doRequest() [soapclient.--dorequest]: Failed to enable crypto [CORE/vendors/Startrack/WSSecurity.php, line 110]
Warning (2): SoapClient::__doRequest() [soapclient.--dorequest]: connect() failed: Unspecified error [CORE/vendors/Startrack/WSSecurity.php, line 110]
Notice (8): Undefined property: SoapFault::$detail [APP/controllers/startrack_controller.php, line 38]
Notice (8): Trying to get property of non-object [APP/controllers/startrack_controller.php, line 38]
Could not connect to host
这是从Mac OSX Lion服务器提供的。安装了PHP 5.3.3,并启用了OpenSSL,Curl和SOAP的扩展。这是在CakePHP中构建的,它解释了上面错误消息的语法。我正在使用已提供的PHP Web服务包。以上是通过MAMP托管的,但我希望不必依赖MAMP。
我能找到的唯一不兼容性是在OpenSSL头文件和库版本之间,但据我所知,这不应该是一个问题吗?
OpenSSL Library Version OpenSSL 0.9.8r 8 Feb 2011
OpenSSL Header Version OpenSSL 0.9.8l 5 Nov 2009
我试图了解假设的“冲突”是否在我的服务器和远程服务器之间? WSDL文件包含在Web Service API中,因为它们希望避免任何问题,并且它可以在同一台计算机上通过MAMP安装工作。所以我认为这是Apache / PHP和Curl / OpenSSL之间的设置问题。
任何关于如何确定实际问题并纠正它的指示都将不胜感激。
答案 0 :(得分:0)
这可能是因为您尝试连接启用SSL 3的服务器,可能(?)禁用了SSL 2。
尝试在命令行上连接到服务器:
openssl s_client -connect {SERVER NAME OR IP}:443 -state
如果这不起作用,请尝试连接如下:
openssl s_client -ssl3 -connect {SERVER NAME OR IP}:443 -state
如果确实有效,请尝试创建一个类似于this one found in the PHP documentation的包装类。
您应该添加类似于:
的行 curl_setopt($handle, CURLOPT_SSLVERSION, 3);
在callCurl
函数内部强制SOAP连接ssl的第三版。