Android:以编程方式确定设备的TLS支持

时间:2017-03-17 10:40:54

标签: android ssl https

所以我使用的主机最近禁用了TLS 1.0,因此对于任何不支持TLS 1.0的设备,我需要使用http而不是https(无论如何都不会发送任何敏感信息...我只是喜欢使用SSL来处理所有内容在可能的情况下)。

自API 16以来,似乎已支持TLS 1.1 / 1.2,但默认情况下未启用,因为在API 20或21周围。有关确切何时切换默认值的报告存在冲突。参见例如here(API 20建议)和here(API 21建议)。似乎有些设备甚至在API 20之前都启用了TLS 1.1 / 1.2支持,可能是因为制造商调整了一些事情来实现这一点。

我知道可以在支持它的设备上启用TLS 1.1 / 1.2(参见例如here),甚至可以通过播放服务来实现,如here所述。< / p>

但我宁愿没有实现这些类型的黑客(以及处理用户的任何问题)的麻烦,只是接受运行我的应用程序但尚未支持TLS 1.1 / 1.2的任何设备应该使用http而不是比https。正如我所说,无论如何都不会被归类为“敏感”。随着时间的推移,不支持TLS 1.1 / 1.2的设备数量将会减少。

那么,话虽如此,有没有办法以编程方式确定设备支持哪些TLS版本?

目前我只是使用API​​版本进行此检查(“从API 21开始使用https”),但最好更明确地检查TLS支持,因为一些旧设备也支持TLS 1.1 / 1.2。

2 个答案:

答案 0 :(得分:8)

  

那么,话虽如此,有没有办法以编程方式确定设备支持哪些TLS版本?

试试这个:

SSLParameters sslParameters;
try {
    sslParameters = SSLContext.getDefault()
            .getDefaultSSLParameters();
} catch (NoSuchAlgorithmException e) {
    // ...
}

// SSLv3, TLSv1, TLSv1.1, TLSv1.2 etc.
sslParameters.getProtocols();

答案 1 :(得分:0)

使用如上所述的安全性setValues()是最好的方法,并且使用@nandsito中的代码段非常适合调试(尤其是在旧设备(例如默认具有SSLv3和TLSv1的Samsung Galaxy S3,但没有TLSv1的设备)上.1和TLSv1.2)。