在PHP中进行SOAP调用并设置SSL版本
我已经编写了几个使用外部WSDL的脚本。我遇到了一个我必须集成到我们的系统中,但我无法工作的问题。我已经试了一个星期没有结果了 脚本已无法创建构造函数:在PHP中进行SOAP调用并设置SSL版本,php,soap,ssl,curl,wsdl,Php,Soap,Ssl,Curl,Wsdl,我已经编写了几个使用外部WSDL的脚本。我遇到了一个我必须集成到我们的系统中,但我无法工作的问题。我已经试了一个星期没有结果了 脚本已无法创建构造函数: $client = new SoapClient("https://webtjener09.kred.no/TestWebservice/OppdragServiceSoapHttpPort?WSDL"); 给出了错误: PHP Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load fro
$client = new SoapClient("https://webtjener09.kred.no/TestWebservice/OppdragServiceSoapHttpPort?WSDL");
给出了错误:
PHP Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://webtjener09.kred.no/TestWebservice/OppdragServiceSoapHttpPort?WSDL' : failed to load external entity "https://webtjener09.kred.no/TestWebservice/OppdragServiceSoapHttpPort?WSDL"
我确实安装了openssl并使用PHP,还记得我已经通过SSL对其他WSDL进行了其他工作SOAP调用。我发现我也不能用证书解决这个问题,因为它在构造函数中已经失败了
但是:
我尝试使用openssl命令行连接到远程服务器,但该命令也失败:
openssl s_client -connect webtjener09.kred.no:443 -state
但后来我尝试将其强制到SSL3,它工作得非常好,如下所示:
openssl s_client -ssl3 -connect webtjener09.kred.no:443 -state
curl_setopt($ch, CURLOPT_SSLVERSION, 3);
这让我想到我必须匹配远程服务器的SSL版本。为了进行双重检查,我还尝试通过PHP进行cURL连接,但失败了,直到我添加了强制SSL版本,如下所示:
openssl s_client -ssl3 -connect webtjener09.kred.no:443 -state
curl_setopt($ch, CURLOPT_SSLVERSION, 3);
将CURLOPT_SSLVERSION添加到cURL连接使其正常。然后是我问题的根源:
如何强制PHP soap构造函数/调用也使用SSL3。在我看来,这必须是解决办法。但我还没有找到如何将PHP SOAP函数设置为仅使用SSL3。既然commandline-openssl-和PHP-cURL都是使用SSL3强制的,那么我想我的SOAP函数也会发生同样的事情
请输入
(使用UbuntuLinux,PHP5.3.3)尝试“sslv3://webtjener09…”或者使用一个可以设置所需的cURL选项的函数。我遇到了同样的问题,下面的包装解决了它(我不得不强制使用SSL2) 顺便说一句,如果在下载WSDL文件部分失败,那么手动下载WSDL(例如使用curl),并在本地使用该文件。在WSDL下载阶段,不调用IMHO _udoRequest
file_put_contents(dirname(__FILE__) .'/Server.wsdl',get_wsdl()); //get_wsdl uses the same wrapper as above
$oWS = new StupidWrapperForOracleServer(dirname(__FILE__) .'/Server.wsdl',array('trace'=>1,'cache_wsdl'=>0));
您可以尝试添加以下代码片段,而不是创建包装器吗
$stream_opts = array(
// 'ssl'=>array('ciphers'=>"3DES" // also working
// further ciphers on http://www.openssl.org/docs/apps/ciphers.html
'ssl'=>array('ciphers'=>"SHA1"
)
);
$myStreamContext = stream_context_create($stream_opts);
$soapOptions['stream_context'] = $myStreamContext;
$soapClient = new SoapAuthClient("https://...", $soapOptions);
祝你好运 如果使用Oracle Weblogic 11g在SSL下托管web服务,请确保使用基于JSSE的SSL实现 登录Weblogic控制台,进入服务器->(您的服务器)->配置->SSL->高级,并选中使用JSSE SSL复选框
更多信息可在中找到。如果使用utf-8字符集,请小心。
此解决方案运行良好,但必须在header Curl中声明字符集
curl_setopt($handle, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml; charset = utf-8", 'SOAPAction: "' . $action . '"')
从PHP5.5.0开始,我相信您可以做到
$client = new SoapClient("https://webtjener09.kred.no/TestWebservice/OppdragServiceSoapHttpPort?WSDL", array(
'ssl_method' => SOAP_SSL_METHOD_SSLv3
));
两种方法都试过了,但都不管用。嗯,这可能是因为我的包装类没有100%正确。因此,如果你给我举个例子,那就太好了。使用
sslv3://
而不是ssl://
。谢谢。由于PHP5.5.0,可以为SoapClient设置SSL_方法,但如果在尝试获取WSDL文件时出现问题,则必须通过cURL手动下载。您能否通过解释SOAP_SSL_方法的好处来详细说明您的建议?SOAP\u SSL\u METHOD\u SSLv23与根本不提供任何方法有什么区别?