我目前正在针对使用 PHP 的 SOAP 服务器进行集成,但它没有按我预期的那样工作,所以我想了解网络上发生了什么。我安装了 Charles ,并定期将其与 OS X 的系统范围代理设置一起使用。然而,PHP 的 SoapClient 不使用这些,所以我不得不弄清楚如何手动完成。
启用 SoapClient 通过代理发送非常简单, Lorna Mitchell 在 使用 Charles 调试 PHP SOAP 中对此进行了记录:
$options = [
"cache_wsdl" => WSDL_CACHE_NONE,
"soap_version" => SOAP_1_1,
"trace" => 1,
"proxy_host" => "localhost",
"proxy_port" => 8888,
];
$client = new \SoapClient($wsdl, $options);
我这样做了,看到了查尔斯的交通。但是,我的服务端点是 SSL,我看到了这个错误:
$options = [
"cache_wsdl" => WSDL_CACHE_NONE,
"soap_version" => SOAP_1_1,
"trace" => 1,
"proxy_host" => "localhost",
"proxy_port" => 8888,
];
$client = new \SoapClient($wsdl, $options);
看着查尔斯,我看到了这张纸条:
您可能需要配置您的浏览器或应用程序以信任 Charles 根证书。请参阅帮助菜单中的 SSL 代理。
啊哈!
我们再次向 Lorna 寻求如何解决这个问题。这一次,我们需要使用她为 TechPortal 编写的 Manipulating HTTP with Charles Proxy 。不幸的是,该网站不使用部分链接,因此一直向下滚动到 Charles 和 SSL 部分以查找有关如何为 SSL 代理设置 Charles 的相关信息。
在 OS X 上,您只需执行以下操作:
- 帮助 -> SSL 代理 -> 安装 Charles 根证书
-
代理 -> SSL 代理设置:
- 检查启用 SSL 代理
- 将端点的域添加到位置列表
最后,我需要告诉 SoapClient 信任 Charles 的根证书,以便它可以解密 SSL 流量。
这是通过下载 Charles 根证书(帮助 -> SSL 代理 -> 保存 Charles 根证书)并将其存储在某处来完成的。我选择放在/usr/local/etc/charles-ssl-proxying-certificate.crt中。
最后,配置一个知道此证书的新 stream_context 并将其添加到 SoapClient:
$options = [
"cache_wsdl" => WSDL_CACHE_NONE,
"soap_version" => SOAP_1_1,
"trace" => 1,
"proxy_host" => "localhost",
"proxy_port" => 8888,
];
$client = new \SoapClient($wsdl, $options);
现在一切正常,我可以看到发送到 SSL SOAP 服务的实际数据,我解决了我的问题!