在 PHP SoapClient 中禁用证书验证

2022-08-30 09:10:50

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

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

难道我没有意识到这是一个巨大的安全风险吗?
这仅用于测试。当服务投入生产时,将有一个有效的证书,并且客户端将被迫对其进行验证。


答案 1

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

文档:


答案 2

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

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

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


推荐