iOS/Android应用TLS Client Hello含未知版本被运营商DPI阻断如何修复
iOS/Android应用在俄罗斯部分运营商网络下TLS请求被阻断问题
我发现我的iOS和Android原生移动应用在俄罗斯部分运营商网络下不明原因无法正常工作。我通过Wireshark初步排查到了该现象的原因(后续发现判断有误,见下文更新内容):

如果TLS Client Hello包的supported_version字段包含未知版本,就会被运营商的DPI设备阻断,我的后端服务器无法收到该请求。
但同时我通过浏览器JS或者Insomnia发起相同的REST API请求时可以正常访问,对应的TLS Client Hello包中不包含任何“未知版本”。

TLS未知版本号每次都会随机变化,可能是0xbaba、0xcaca、0x1a1a等符合0x_a_a格式的数值。
我不确定,但推测该过滤规则是俄罗斯多数运营商开始启用的政府防火墙设备执行的,因为在没有部署该设备的网络中不会出现该问题,因此我无法在运营商侧修复该问题。
我如何让Swift和Kotlin开发的应用不在TLS协议中使用这些未知版本?
更新
看起来不支持的版本号并不是导致该现象的原因,我在同一设备上用Safari打开对应URL时,数据包中也包含该未知版本号。
我随后在TLS数据包中发现了另一个差异:
- 该数据包被阻断(来自我的应用):

- 该数据包正常通行(来自Safari):

更新2
设置NSExceptionRequiresForwardSecrecy=NO解决了该问题。
内容的提问来源于stack exchange,提问作者sbca68
相关产品推荐
相关产品推荐

