在PHP中进行SOAP调用并设置SSL版本

在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

我已经编写了几个使用外部WSDL的脚本。我遇到了一个我必须集成到我们的系统中,但我无法工作的问题。我已经试了一个星期没有结果了

脚本已无法创建构造函数:

$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与根本不提供任何方法有什么区别?