使用 Charles 通过 SSL 调试 PHP SOAP

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

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

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