伙计们,我希望我遗漏了一些明显的东西,我希望有人能够提供一些启示。我试图让 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 “不支持协议 TLSv1.2”。
我可以看到上下文声称支持 TLSv1.2,但是我从该上下文制作的引擎不支持?这里发生了什么?如果我在上面的第一行中使用“TLS”而不是“TLSv1.2”,这些都不会改变,顺便说一句。
我认为这可能与这个问题有关,并且我已经阅读了这个(尚未回答的)问题和类似的文章,但它们似乎并没有达到目的 - 我见过的所有解决方案似乎都依赖 SSLSocket 而不是 SSLEngine。
非常感谢您提供的任何知识。
更新 6/23/14 10AMEDT
所以我找到SSLEngine.setSSLParameters
了,我希望它能让我传入我从中获得的 SSLParameters SSLContext.getSupportedSSLParameters()
,但是当我调用它时,我得到一个声称不支持密码套件的异常,所以看起来 setSSLParameters() 只是在做与 setEnabledCipherSuites() 所做的相同,并且引擎已经处于无法将 TLS 1.2 协议/套件识别为受支持的状态。