使用 Charles 通过 SSL 调试 PHP SOAP

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 54w+ 字,讲解图 2476+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 1900+ 小伙伴加入学习 ,欢迎点击围观

我目前正在针对使用 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 服务的实际数据,我解决了我的问题!