ChatGPT解决这个技术问题 Extra ChatGPT

在 PHP SoapClient 中禁用证书验证

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

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

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

如果建议的解决方案有效,我也很感兴趣

K
Kaii

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

文档:

stream_context_create() 文档

HTTP 上下文选项 Docs

SSL 上下文选项 Docs


不幸的是,这似乎不起作用,verify_peer 选项已经默认为 false (php.net/manual/en/context.ssl.php)。
@zpon:这通常有效。结帐您没有使用具有不同选项的不同 SSL 子层。还要仔细检查您没有遇到 PHP 错误,请参阅相关问题:Php SoapClient stream_context option
allow_self_signed 设置为 true 怎么样?也默认为 false
上述解决方案不适用于 php 版本 5.6.31。我在安装 magento 的同一台服务器上使用测试脚本。我得到的错误是:致命错误:未捕获的 SoapFault 异常:[VersionMismatch] 错误版本
t
tobik

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

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

请注意,您在创建 SoapServer 时也必须这样做。


我已经在 PHP7 中尝试了接受的答案,它在 WSDL 模式下工作。所以也许这个问题现在已经解决了。
H
Hassaan

PHP 5.6.8 的正确列表是

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

M
Milind Singh
"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
            ));