在PHP SoapClient中禁用证书验证

MW.*_*MW. 56 php ssl https soap soap-client

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

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

我不是意识到这是一个巨大的安全隐患吗?
这仅用于测试.当服务投入生产时,将会有一个有效的证书,客户端将被强制验证它.

Kai*_*aii 98

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
]);
Run Code Online (Sandbox Code Playgroud)

文档:

  • 不幸的是,这似乎不起作用,并且verify_peer选项默认默认为false(http://php.net/manual/en/context.ssl.php)。 (2认同)
  • 那么`allow_self_signed`设置为`true`怎么样?也违反了"假" (2认同)

tob*_*bik 12

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

如建议的那样,最简单的方法是手动下载WSDL文件并将本地副本传递给SoapClient.例如,您可以file_get_contents使用接受的答案中的相同流上下文来下载它.

请注意,创建SoapServer时还必须执行此操作.

  • 我在PHP7中尝试了接受的答案,它在WSDL模式下工作.所以也许这个问题现在已经解决了. (6认同)