返回
Charles 代理本地域名引发的 HTTPS 惨案
后端
2024-01-29 08:01:21
序言
于 2022-07-23 这天,翘首以盼的个人项目终于踏出了前进的一步,原因在于,今天将正式启动第三方登录接口的开发。回顾过去半年,项目进展之迟缓令人心生慨叹,而其中一个拖延的原因,恐怕要归咎于本人那近乎洁癖的代码风格和架构洁癖。
前情提要
着手第三方登录功能之初,我便面临着一个困扰:如何在本地环境下进行调试。众所周知,第三方登录需要经过一个授权回调的过程,而这通常涉及到从远程服务器重定向到本地开发环境。为了解决这个问题,通常有两种方法可供选择:
1. 修改 hosts 文件,将远程服务器域名映射到本机 IP 地址。
2. 使用反向代理工具,如 Charles,将远程服务器的请求代理到本地环境。
出于谨慎起见,我选择了后者,并对 Charles 的配置进行了精心的设置。然而,当我在 Chrome 浏览器中测试登录流程时,却意外地遇到了一个令人费解的错误:HTTPS 证书验证失败。
拨云见日
起初,我怀疑是 Charles 的 SSL 代理功能出了问题。我反复检查了证书设置,但一切似乎都已正确配置。就在我即将放弃的时候,我灵光一闪,想到也许是本地域名与 HTTPS 协议之间的冲突。
在 HTTPS 通信中,服务器会向客户端发送一个包含其证书的 SSL 证书。客户端随后会验证该证书的有效性,以确保连接是安全的。然而,在本地域名的情况下,证书中的域名与实际请求的域名不匹配,导致验证失败。
解决之道
意识到问题的根源后,解决方法变得简单明了。我只需要为本地环境生成一个自签名证书,并将其安装到 Charles 中即可。具体步骤如下:
1. 打开终端或命令提示符,运行以下命令生成自签名证书:
```
openssl req -x509 -newkey rsa:4096 -nodes -sha256 -days 365 -keyout server.key -out server.crt
```
2. 将生成的证书文件(server.crt 和 server.key)导入 Charles。
3. 在 Charles 中,选择 **Proxy** 菜单,然后选择 **SSL Proxying Settings** 。
4. 在 **SSL Proxying** 选项卡中,选中 **Enable SSL Proxying** 复选框。
5. 在 **Client Certificates** 部分中,单击 **Add** 按钮并导入 **server.crt** 证书。
6. 单击 **OK** 按钮保存更改。
后记
通过这些简单的步骤,我成功地解决了 HTTPS 证书验证失败的问题。这一经历也让我认识到,在进行网络调试时,需要全面考虑各种可能性,包括那些乍看之下似乎微不足道的因素。希望我的分享能为其他遇到类似问题的朋友提供一些帮助。