【问题标题】:Making SOAP-call in PHP and setting SSL version在 PHP 中进行 SOAP 调用并设置 SSL 版本
【发布时间】:2011-01-18 08:11:56
【问题描述】:

我已经制作了几个使用外部 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

这让我想到我必须匹配远程服务器的 SSL 版本。为了仔细检查,我还尝试通过 PHP 建立 cURL 连接,但它失败了,直到我添加了这样的 SSL 版本的强制:

curl_setopt($ch, CURLOPT_SSLVERSION, 3);

将 CURLOPT_SSLVERSION 添加到 cURL 连接就可以了。然后是我的问题的根源:

如何强制 PHP soap 构造函数/调用也使用 SSL3。在我看来,这必须是解决方案。但我还没有找到如何将 PHP SOAP 函数设置为仅使用 SSL3。由于命令行 -openssl- 和 PHP cURL 都强制使用 SSL3,所以我认为我的 SOAP 函数也会发生同样的事情?

请输入?

(使用 Ubuntu Linux,PHP 5.3.3)

【问题讨论】:

  • 从 PHP 5.5.0 开始可以为 SoapClient 设置 SSL_METHOD,但如果尝试获取 WSDL 文件时出现问题,则必须通过 cURL 手动下载。

标签: php soap ssl curl wsdl


【解决方案1】:

我有同样的问题,下面的包装解决了它(我不得不强制 SSL2)

class StupidWrapperForOracleServer extends SoapClient {
  protected function callCurl($url, $data, $action) {
     $handle   = curl_init();
     curl_setopt($handle, CURLOPT_URL, $url);
     curl_setopt($handle, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml", 'SOAPAction: "' . $action . '"'));
     curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
     curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
     curl_setopt($handle, CURLOPT_SSLVERSION, 2);
     $response = curl_exec($handle);
     if (empty($response)) {
       throw new SoapFault('CURL error: '.curl_error($handle),curl_errno($handle));
     }
     curl_close($handle);
     return $response;
   }

   public function __doRequest($request,$location,$action,$version,$one_way = 0) {
       return $this->callCurl($location, $request, $action);
   }
 }

顺便说一句。如果在下载 WSDL 文件部分失败,则手动下载 WSDL(例如使用 curl),并在本地使用该文件。恕我直言,在 WSDL 下载阶段不会调用 __doRequest。

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));

【讨论】:

    【解决方案2】:

    从 PHP 5.5.0 开始,我相信你可以做到

    $client = new SoapClient("https://webtjener09.kred.no/TestWebservice/OppdragServiceSoapHttpPort?WSDL", array(
        'ssl_method' => SOAP_SSL_METHOD_SSLv3
    ));
    

    【讨论】:

    • 您能否通过解释 SOAP_SSL_METHOD_SSLv3 的好处来详细说明您的建议?与 SOAP_SSL_METHOD_SSLv23 或根本不提供任何方法有什么区别?
    【解决方案3】:

    您可以尝试添加以下代码片段而不是创建包装器吗?

    $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);
    

    祝你好运!

    【讨论】:

      【解决方案4】:

      尝试 'sslv3://webtjener09....' 或使用 wrapper class,您可以在其中设置所需的 cURL 选项。

      【讨论】:

      • 两种方法都试过了,但都不管用。好吧,可能是我没有 100% 正确的包装类。所以如果你有一个例子给我,那就太好了。
      • 使用sslv3:// 而不是ssl://。谢谢。
      【解决方案5】:

      如果您使用 Oracle Weblogic 11g 在 SSL 下托管您的 Web 服务,请确保您使用的是基于 JSSE 的 SSL 实现。

      登录 Weblogic 控制台,然后转到服务器->(您的服务器)->配置->SSL->高级并选中使用 JSSE SSL 复选框。

      更多信息可以在Weblogic Manuals找到

      【讨论】:

        【解决方案6】:

        如果您使用 utf-8 字符集,请小心。
        此解决方案效果很好,但您必须在标头 Curl 中声明字符集。

        curl_setopt($handle, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml; charset = utf-8", 'SOAPAction: "' . $action . '"')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-05-09
          • 1970-01-01
          • 1970-01-01
          • 2013-07-23
          • 2016-11-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多