【发布时间】: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
【问题讨论】:
-
如错误显示,WSDL 文件在提供的路径上不存在,请确保该文件存在于路径上。
-
如果我尝试在浏览器中运行 test_site.com/test?wsdl 我会收到 wsdl 文件
-
看到这个 - stackoverflow.com/questions/28109505/… 可能对你有帮助
-
您可以使用该功能查看证书位置。我不需要,我在stream_context中设置了pem文件。