【问题标题】:SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://***?wsdl'SOAP 错误:解析 WSDL:无法从“https://***?wsdl”加载
【发布时间】:2019-04-04 15:01:55
【问题描述】:

我有使用 pem 文件的 Soap 客户端

$url = "https://test_site.com/test?wsdl";
$action = 'http://xmlns.test_site.com/CoreObjects/GetData';

$client = new SoapClient(
    $url,
    [
        'stream_context'=> stream_context_create([
            'ssl' => [
                'local_cert'        => 'keys/includesprivatekey.pem',
                'passphrase'        => 'secret_word',
                'verify_peer'       => false,
                'verify_peer_name'  => false,
                'allow_self_signed' => true,
            ]
        ]),
        'cache_wsdl'    => WSDL_CACHE_NONE,
        'trace'         => 1,
        'exceptions'    => 1,
        'soap_version' => SOAP_1_2,
        'verifypeer' => false,
        'verifyhost' => false,
    ]
);

echo $client->__doRequest($xml, $url, $action, 1);

当我尝试在没有 local_cert 文件的情况下发送请求时,我从 API 收到带有 NULL 证书文件的响应。当我添加 local_cert 文件时,我收到致命异常:

致命错误:未捕获的 SoapFault 异常:[WSDL] SOAP-ERROR: Parsing WSDL:无法从 'https://test_site.com/test?wsdl' : 未能加载外部实体 "https://test_site.com/test?wsdl" 在 /srv/index.php

这是 pem 文件示例:

-----BEGIN CERTIFICATE-----
MIICfzCCAjGgAwIBAgIKAYoCQucBEgIF1TANBgkqhkiG9w0BAQQFADBdMQswCQYD
VQQGEwJVQTEOMAwGA1UEBxQFSVRfR08xDjAMBgNVBAoUBUlUX0dPMQ4wDAYDVQQL
FAVJVF9HTzEOMAwGA1UEDBQFSVRfR08xDjAMBgNVBAMUBUlUX0dPMB4XDTE1MDgy
ODA3NDAxMloXDTI1MD
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIICXDIBAAKBgQDhMZM9vKUJXMEHR60ZPF9vmGF5pJvx3jL5kY491sRmgnS4eluV
kvqSnXfrT+ZG82nGYZhRiLVnwKvE6/Zv8QnCSJsPCwTffEuF147CPW4/5ofMA97e
tn7xr557lckVALHwAfGiDXJLkMAsECc4AoGGOs9Iv6a5ru+AXlRDW63VGQIDAQAB
AoGAbUsBOiJXOs8AhAb+
-----END RSA PRIVATE KEY-----

怎么了?

++++++++++++++++++++++++++++++++++++++++++

更新:

您的问题已被确定为可能与另一个问题重复 题。如果那里的答案不能解决您的问题,请 编辑以详细解释您的问题中独特的部分。

不,它不是重复的。我有需要发送给客户的证书。 如果我从 stream_context 中删除 local_cert 我在下载 wsdl 文件时不会在第一步收到错误,但会收到来自客户端 api 的错误。

Does PHP SoapClient support HTTPS connections 中的解决方案是下一个

我在使用 php 5.6 的 Windows 上遇到了同样的问题,但在使用 php 5.6 的 Linux 上也可以正常工作。

在LINux环境下工作确实解决了这个问题

这不是解决方案。我在 Ubuntu 16.04 中使用 php7.0 工作并尝试使用 php5.6

【问题讨论】:

标签: php ssl soap


【解决方案1】:

也许已经晚了,但如果有人读到这个原因也有同样的问题,这可能与证书问题有关。

.pem 证书必须具有“PRIVATE KEY”而不是“RSA PRIVATE KEY”,您可以使用 openssl 从 .pfx 或 .p12 重新颁发它,使用以下命令:

openssl pkcs12 -in *certname.*extension -out cert.pem -clcerts -nokeys
openssl pkcs12 -in *certname.*extension -out key.pem -nocerts -nodes

考虑到您需要手动合并“cert.pem”中的结果,删除所有不在标签之间的文本:

-----BEGIN CERTIFICATE-----
MIIEvQIBADANB.....GqvF7B/rM=
-----END CERTIFICATE-----

并在结果文件末尾复制私钥

-----BEGIN PRIVATE KEY-----
MIIEvQIBADANB.....kDIjNMnIzOQ=
-----END PRIVATE KEY-----

【讨论】:

  • 这对我不起作用。
  • @TomS 正如我在回复中所说,可能是由证书引起的。如果不是您的情况,那么我建议您在“主机”文件中指明与您需要连接以获取 WSDL 的域相关的 IP。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-23
相关资源
最近更新 更多