在PHP SoapClient中禁用证书验证

时间:2011-12-09 09:42:52

标签: php soap ssl https soap-client

要点:
有没有办法强制PHP内置的SoapClient类通过HTTPS连接到证书无效的服务器?

为什么我要这样做?
我在没有DNS条目或证书的服务器上部署了一个新的应用程序。我想在设置DNS条目并修复证书之前尝试使用SoapClient 连接它,最合理的方法是让客户端在测试期间忽略证书。

难道我不知道这是一个巨大的安全隐患吗?
这仅用于测试。当服务投入生产时,将会有一个有效的证书,客户将被迫验证它。

4 个答案:

答案 0 :(得分:88)

SoapClient在其参数中加入流上下文,您可以自行创建。这样,您几乎可以控制传输层的每个方面:

$context = stream_context_create([
    'ssl' => [
        // set some SSL/TLS specific options
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
    ]
]);

$client  = new SoapClient(null, [
    'location' => 'https://...',
    'uri' => '...', 
    'stream_context' => $context
]);

文档:

答案 1 :(得分:12)

接受的答案有效但仅限于非WSDL 模式。如果您尝试在 WSDL 模式中使用它(即,您将WSDL文件URL作为第一个参数传递),您将面临下载WSDL文件时忽略流上下文这一事实。因此,如果WSDL文件也位于证书损坏的服务器上,它将失败,很可能抛出消息failed to load external entity。查看更多herehere

正如所建议的,最简单的方法是手动下载WSDL文件并将本地副本传递给SoapClient。您可以使用file_get_contents使用与接受的答案完全相同的流上下文来下载它。

请注意,在创建SoapServer时也必须执行此操作。

答案 2 :(得分:3)

PHP 5.6.8的正确列表是

'ssl' => array('verify_peer_name'=>false, 'allow_self_signed' => true),

答案 3 :(得分:0)

"verify_peer"=>false,
"verify_peer_name"=>false,

这适用于php 5.6.x;

$arrContextOptions=stream_context_create(array(
            "ssl" => array(
                 "verify_peer" => false,
                 "verify_peer_name" => false,
            )));
$this->client = new \SoapClient("https://tests.com?WSDL",
              array(
                //"soap_version" => SOAP_1_2,
                "trace"      => 1,      // enable trace to view what is happening
                "exceptions" => 0,      // disable exceptions
                "cache_wsdl" => 0,      // disable any caching on the wsdl, encase you alter the wsdl
                "stream_context" => $arrContextOptions
              ) 
                    
            );

或者如果您愿意,可以添加到cyrpto方法

$arrContextOptions=stream_context_create(array(
            "ssl"=>array(
                 "verify_peer"=>false,
                 "verify_peer_name"=>false,
                 'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT
            ));