大家好,我希望我错过了一些显而易见的东西,希望有人能够给予一些指导。我正在尝试在SSL + NIO上下文(使用AndroidAsync库)中启用TLSv1.2,因此我尝试通过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",则所有内容都不会改变。
我猜想这可能与此问题有关,我已经阅读了这个(尚未回答)的问题和像这样的文章,但它们似乎没有完全解决问题——我看到的解决方案似乎都依赖于SSLSocket而不是SSLEngine。
非常感谢您能提供的任何知识。
更新 6/23/14 10:00AM EDT
我找到了 SSLEngine.setSSLParameters
,我希望可以通过它传递一个从 SSLContext.getSupportedSSLParameters()
获取的 SSLParameters,但是当我调用它时,会抛出一个异常,声称不支持密码套件,因此看起来 setSSLParameters() 只是做与 setEnabledCipherSuites() 相同的事情,并且引擎已经处于一种状态,在该状态下它不识别 TLS 1.2 协议 / 套件作为受支持的。
sslContext.setEnabledProtocols(new String[] { "TLSv1.2" })
,然后执行sslContext.createSSLEngine();
会发生什么? - Martin Konecny