android - 让 SSLEngine 在 Android (4.4.2) 上使用 TLSv1.2?

标签 android sslengine

伙计们,我希望我缺少一些明显的东西,我希望有人能够提供一些启示。我试图让 TLSv1.2 在 SSL + NIO 上下文中运行(使用 AndroidAsync 库),所以我试图通过 SSLEngine 启用它。我可以运行这样的代码:

        SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
        sslContext.init(null, null, null);
        String[] protocols = sslContext.getSupportedSSLParameters().getProtocols();
        for (String protocol : protocols) {
            Timber.d("Context supported protocol: " + protocol);
        }

        SSLEngine engine = sslContext.createSSLEngine();
        String[] supportedProtocols = engine.getSupportedProtocols();
        for (String protocol : supportedProtocols) {
            Timber.d("Engine supported protocol: " + protocol);
        }

我最终在 logcat 上看到了这个:

06-22 21:56:27.715    1117-1117/? D/XXX﹕ Context supported protocol: SSLv3
06-22 21:56:27.715    1117-1117/? D/XXX﹕ Context supported protocol: TLSv1
06-22 21:56:27.725    1117-1117/? D/XXX﹕ Context supported protocol: TLSv1.1
06-22 21:56:27.725    1117-1117/? D/XXX﹕ Context supported protocol: TLSv1.2
06-22 21:56:27.735    1117-1117/? D/XXX﹕ Engine supported protocol: TLSv1
06-22 21:56:27.745    1117-1117/? D/XXX﹕ Engine supported protocol: SSLv3

当然,如果我尝试 engine.setEnabledProtocols(new String[] { "TLSv1.2"}) 我会收到 IllegalArgumentException "Protocol TLSv1.2 is not supported."

我可以看到上下文声称支持 TLSv1.2,但是我从该上下文创建的引擎不支持?这里发生了什么?如果我在上面的第一行中使用“TLS”而不是“TLSv1.2”,这些都不会改变,顺便说一句。

我猜这可能与 this issue 有关,我读过 this (as yet unanswered) questionarticles like this ,但它们似乎并没有完全到位——我见过的所有解决方案似乎都依赖于 SSLSocket 而不是 SSLEngine。

非常感谢您提供的任何知识。

2014 年 6 月 23 日更新 10AMEDT

所以我找到了 SSLEngine.setSSLParameters,我希望它能让我传入从 SSLContext.getSupportedSSLParameters() 获得的 SSLParameters,但是当我调用它时我收到一个声称不支持密码套件的异常,因此看起来 setSSLParameters() 只是在做与 setEnabledCipherSuites() 相同的事情,并且引擎已经处于无法识别 TLS 1.2 的状态支持的协议(protocol)/套件。

最佳答案

Android API 文档 correctly state TLSv1.2 仅支持 API 级别 20 或更高版本 (Lollipop) 中的 SSLEngine,而 SSLSocket 从级别 16 开始支持它。

使用 SSLSocket 或要求 API 20 对我们的项目来说不是选项,也没有更改服务器代码以允许 TLSv1 或 SSLv3。我们的解决方案是使用 Google Play Services 安装更新的安全提供程序:

    ProviderInstaller.installIfNeeded(getApplicationContext());

这有效地使您的应用可以访问更新版本的 OpenSSL 和 Java 安全提供程序,其中包括对 SSLEngine 中的 TLSv1.2 的支持。安装新的提供程序后,您可以按照通常的方式创建支持 SSLv3、TLSv1、TLSv1.1 和 TLSv1.2 的 SSLEngine:

    SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
    sslContext.init(null, null, null);
    SSLEngine engine = sslContext.createSSLEngine();

或者您可以使用 engine.setEnabledProtocols 限制启用的协议(protocol)。

关于android - 让 SSLEngine 在 Android (4.4.2) 上使用 TLSv1.2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24357863/

相关文章:

android - 循环内的 OnClickListener 抛出 IndexOutOfBounds 异常

android - 如何在 Android 中进行平滑的图像旋转?

java - SSLEngine 握手卡在第二个循环

ssl - Netty ClientBootstrap SSL 握手终止——Channel/ClientBootstrap 关闭?

rest - SSLEngine 不解密所有数据

Apache:无效命令 'SSLEngine',可能拼写错误或由未包含在服务器配置中的模块定义

java - 在 Libgdx 中创建另一个纹理时,我应该调用 dispose() 纹理吗?

java - 如何在 onCreate/主线程中获取房间列表的大小?

Android:应用程序被杀死时如何保持持久性?

java - 使用 JSSE SSLEngine 进行 SSL session 管理