Gle*_*len 22 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);
}
Run Code Online (Sandbox Code Playgroud)
我最终在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
Run Code Online (Sandbox Code Playgroud)
当然,如果我尝试engine.setEnabledProtocols(new String[] { "TLSv1.2" })
获取IllegalArgumentException"不支持协议TLSv1.2."
我可以看到上下文声称支持TLSv1.2,但那么我从该上下文创建的引擎不是吗?这里发生了什么?如果我在上面的第一行中使用"TLS"而不是"TLSv1.2",顺便说一下,这些都没有改变.
我认为这可能与这个问题有关,而且我已经读过这个(尚未答复的)这样的问题和文章,但它们似乎并没有达到这个位置 - 我见过的解决方案似乎都是依靠SSLSocket而不是SSLEngine.
非常感谢您可以放弃任何知识.
更新2014年6月23日上午10点
所以我发现SSLEngine.setSSLParameters
,我希望能让我传入一个我从中得到的SSLParameters SSLContext.getSupportedSSLParameters()
,但是当我调用它时会得到一个异常,声称密码套件不受支持,所以看起来setSSLParameters()只是在做与setEnabledCipherSuites()相同的事情,引擎已处于无法识别支持的TLS 1.2协议/套件的状态.
小智 62
Android API文档正确声明 TLSv1.2仅支持API级别20或更高版本(Lollipop)中的SSLEngine,而SSLSocket从级别16开始支持它.
使用SSLSocket或要求API 20对于我们的项目来说不是选项,也没有更改服务器代码以允许TLSv1或SSLv3.我们的解决方案是使用Google Play服务安装新的安全提供商:
ProviderInstaller.installIfNeeded(getApplicationContext());
Run Code Online (Sandbox Code Playgroud)
这有效地使您的应用程序可以访问较新版本的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();
Run Code Online (Sandbox Code Playgroud)
或者您可以使用限制启用的协议engine.setEnabledProtocols
.
如果您使用的是okHttp,请尝试此解决方案。 在Android 4.4上启用TLSv1.2的解决方案
在Android <5.0(16 <= API <20)上出现了相同的问题。多亏了您的帖子,我才能够完成这项工作,因此对于任何来到这里的人来说,这都是开箱即用的解决方案。在撰写本文时,我正在使用OkHttp 3.4.1。
标签:找不到可接受的协议,javax.net.ssl.SSLProtocolException:SSL握手已中止:
归档时间: |
|
查看次数: |
24740 次 |
最近记录: |