是否可以限制移动应用程序 (android/iOS) 应用程序仅使用特定的 TLS 版本?

Is it possible to restrict mobile app (android/iOS) application to use only specific TLS version?

是否可以在应用程序代码级别验证特定的 TLSSSL 版本?是否可以限制应用程序仅使用特定的 TLSSSL 版本?

考虑一个场景,网络服务器支持TLS1.01.11.2。移动应用程序(android 或 iOS)是使用更新的 API/SDK 构建的,也支持 TLS 1.2。理论上,TLS上下文在任何协商异常的情况下都会回退到较低的上下文。那么,是否有任何可能的方法在应用程序代码中验证它应该只使用 TLS 1.2 并且不应该接受较低版本。

我在这里看到一些讨论 SSL context can be verified in android。 Android TLS connection and self signed certificate。但是如果服务器端发生任何回退,OS 会覆盖它吗?

如果服务器和客户端都支持 TLS 1.2,则正确实施的 TLS/SSL 堆栈只会协商 TLS 1.2。他们需要协商 最高 相互支持的协议版本,而不是最低版本。

关于如何将协议版本限制为 accept/negotiate 的问题,这取决于您使用的网络库。例如,在 Android 上,如果您直接使用 SSLSocket 实例,则可以在每个 SSLSocket 实例上设置启用的协议。如果您使用的是 HTTP 库,那么它可能会提供使用 SSLSocketFactory 进行参数化的选项,您可以在其中提供自己的 SSLSocketFactory,它包装默认的 SSLSocketFactory,获取 SSLSocket 实例,在其上设置启用的协议集,并且 returns 这些自定义的 SSLSocket 实例到 HTTP 堆栈。

请注意,某些 HTTP 堆栈(例如 okhttp)实现了它们自己的 TLS 协议回退逻辑,该逻辑不会通过 Man-in-The-Middle 检测 TLS 协议降级。这种行为助长了 POODLE 漏洞。