支持AES-NI的Java SSL提供程序

4

有没有可以处理SSL连接并支持AES-NI指令的Java安全提供程序?

我尝试使用SunPKCS11和Mozilla NSS,但对于使用AES加密的SSL连接无效。根据Java PKCS#11参考指南,该提供程序不支持SSLContext.*“算法” :-(


这可能会对您有所帮助,尽管有点旧:https://dev59.com/-nA75IYBdhLWcg3w49YR - Anders R. Bystrup
1
@AndersR.Bystrup:谢谢。我已经找到那个问题了。不幸的是,它现在已经超过2年了。Java7现在已经发布,但我找不到任何关于支持AES-NI的信息(没有SunPKCS11和外部库)。即使如此,我已经运行了SunPKCS11+mozilla-nss,并且对于AES加密的速度提高显着,但它无法处理仍然使用SunJSSE提供程序的SSL连接。 - Peter Štibraný
这是特定于平台的,我不确定这是否属于 Java 领域。然而,我会简单地使用 SWIG 并以这种方式提供对这些本地库的接口。 - wishi
@wishi: 感谢您的评论。不幸的是,我们已经有一个使用Java代码处理连接的相当大的应用程序,您的建议将意味着需要重写其中某些部分。目前这个方案被排除在外。最好的情况是我只想更改安全提供者并保持我们的应用程序不变。 - Peter Štibraný
1
这是一个有关IBM WebSphere的有趣链接:http://www-01.ibm.com/support/docview.wss?uid=swg1IV26016 - Anders R. Bystrup
1
@AndersR.Bystrup: 谢谢Anders。我现在意识到我正在混用两种不同的“技术”/库:JCE(加密)和JSSE(安全套接字)。根据http://docs.oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#PKCS11,“在Java SE 6中,SunJSSE提供程序专门使用JCE进行其所有加密操作,因此能够自动利用JCE功能和增强功能,包括JCE新添加的对PKCS#11的支持。”我需要更好地理解这个...它似乎实际上可以按照我希望的方式工作。 - Peter Štibraný
2个回答

2
2012年12月, 有一些最新的活动来支持x86上的AES-NI。请参见JEPS-164这个合并于2012年12月进入jdk8中,并讨论了此处包括汇编代码更改以支持AES-NI。从讨论中看来,这个更改可能会被回溯到jdk7u12中。 IBM JCE for Java V7在2012年11月包括对AES-NI的支持。
如果使用这些新的JRE之一,您的Java SSL/TLS实现应该利用AES-NI而不使用PKCS11提供程序。
您可以检查BIOS以查看是否可以启用/禁用AES-NI。如果可以,则可以运行AES加密/解密的微基准测试以查看差异。

1
感谢您的回答。我进行了一次完全不科学的微基准测试,并且在使用PKCS11+mozilla-nss的支持AES-NI的机器上,速度提升非常显著... 大约快了4倍。当在不支持AES-NI的机器上运行相同的测试时,加密提供程序之间的差异要小得多,几乎察觉不到。在这个问题中,我想确保在使用SSL套接字时也能获得这个好处。 - Peter Štibraný

1

我相信我已经找到了我的问题的答案。

首先,我混淆了两个不同库的“提供者”:JCE(加密算法实现)和JSSE(安全套接字支持)。

根据JavaTM Secure Socket Extension (JSSE)参考指南,JCE和硬件加速/智能卡支持,默认的JSSE提供程序(SunJSSE)使用JCE进行所有加密操作。

可以通过使用SunPKCS11 + mozilla-nss库来配置JCE以使用硬件加速的AES,例如在this answer中记录的那样。

在我的情况下,需要完成的工作是确保SSL配置了适当的密码,并验证ssl连接实际上使用了SunPKCS11。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接