OpenSSL with Java

123*_*3Ex 20 java openssl

我必须在Java Web项目中使用OpenSSL,我对'OpenSSL'一无所知.

如何将OpenSSL与我的项目集成?有什么好的基础教程可以学习吗?

Tom*_*ros 22

首先:你需要什么库?

  • 如果要使用简单的加密函数,请使用随JDK部署的Java SE Security组件.
  • 如果您需要更高级的功能(例如某些数字签名格式等),请使用加密库(BouncyCastle是最受欢迎的功能之一)
  • 但是,如果您需要从Java代码打开SSL连接,并处理证书身份验证等,您将不需要以下任何一个:
    • 如果您正在使用Java EE容器,则容器可以验证传入的SSL请求:这只是配置问题
    • 此外,如果您需要连接到SSL端口,JDK会提供一些基本类(请参阅此示例).请注意,在这种情况下,您需要在java命令上设置一些系统属性.

喜欢这些属性:

-Djavax.net.ssl.keyStore=keystore_path
-Djavax.net.ssl.keyStorePassword=password
-Djavax.net.ssl.trustStore=truststore_path
-Djavax.net.ssl.trustStorePassword=trustword
Run Code Online (Sandbox Code Playgroud)

  • 如果您实际上想使用 OpenSSL,但由于上述原因都不是,该怎么办……有办法做到吗? (6认同)

小智 8

Apache Tomcat Native Library就是解决方案。 https://github.com/apache/tomcat-native

它使用 OpenSSL 来实现 TLS/SSL 功能。您可以将它用作独立库(就像我所做的那样)或连接您的 Tomcat。它是一个开源项目,具有详细记录的 Java 代码。

为什么要原生tomcat?

JSSE 速度慢且难以使用。在我的项目中,为了获得最佳性能,我们决定为 OpenSSL 查找/编写 JNI 包装器,因为动态升级证书的可能性是一个问号,而且密钥存储太复杂。

由于 Bouncy Castle Crypto API 是用 Java 编写的,因此您不能指望获得最佳效率。

Tomcat Native 是一个包装器,因此您只能使用 OpenSSL 版本的功能。


Miy*_*agi 5

最佳解决方案:使用 Java 的内置安全性来执行简单任务,或使用 BouncyCastle 来执行更高级的任务。

如果您必须使用 Java 中的 OpenSSL,您有 2 个选择:

  1. 从 Java 中将 openssl 作为进程调用。
  2. 为 OpenSSL 创建一个 JNI 层,但这对我来说完全是浪费时间。这些都不是真正的好方法。

  • 如果您需要将其与 HSM 一起使用并且它仅支持 OpenSSL 引擎,则需要考虑另一件事。但现在大多数HSM都带有JAR文件来适应JCE/JCA (2认同)

Bri*_*ski 5

每个人都在谈论BouncyCastle,但在我们的用例中,Gnu Crypto图书馆赢得了胜利.原生java.

对于一些客户,我们的数据库(aerospike)至少花费了10%的时间计算哈希值,因为这些实现很慢.我欢迎在每台Linux机器上都有可用的加密库的本机实现.我认为一些Java7虚拟机会包含更多算法,但我还没有看到它们.


小智 4

在提出任何建议之前,您需要回答几个重要问题

1)你真的想从JAVA中调用C(native)实现吗?

2)OpenSSL中有哪些功能是JCE和BouncyCastle无法解决的

3)范围是否仅限于使用OpenSSL生成的证书,解密OpenSSL生成的文件?

  • 仅供参考:OpenSSL 不是 C++,它是普通的 C。 (3认同)