【问题标题】:OpenSSL with JavaOpenSSL 与 Java
【发布时间】:2011-07-21 22:23:17
【问题描述】:

我必须在 Java Web 项目中使用 OpenSSL,但我对“OpenSSL”一无所知。

如何将 OpenSSL 与我的项目集成?有没有好的基础教程来学习这个?

【问题讨论】:

  • OpenSSL 是一个 C 库,使用起来很尴尬。 javax.cryptobouncycastle 有什么问题?
  • 这些是免费提供的吗?我不知道这是你问的问题,再次感谢,
  • Bouncycastle is MIT X11-derived license(非常免费)。对javax.crypto 包一无所知,当我试图糊弄Oracle 网站时分心了。
  • 感谢您的支持
  • 这是一个合法的问题 - Bouncycastle 未获得某些安全认证(例如 FIPS 140-2)的批准。

标签: java openssl


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的支持,这对我有很大帮助
  • 仅供参考:OpenSSL 不是 C++,而是纯 C。
  • 对 Q2 的回答:BC 不支持 DTLS 的 HELLO(因此您将丢失任何通信中的第一条消息
  • 1) 是 2) 跨语言和平台的互操作性和一致性 3) 不是
【解决方案2】:

首先:你需要图书馆做什么?

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

喜欢这些属性:

-Djavax.net.ssl.keyStore=keystore_path
-Djavax.net.ssl.keyStorePassword=password
-Djavax.net.ssl.trustStore=truststore_path
-Djavax.net.ssl.trustStorePassword=trustword

【讨论】:

  • 如果你真的想使用 OpenSSL 怎么办,因为上述原因都没有......有没有办法做到这一点?
【解决方案3】:

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

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

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

【讨论】:

  • 如果您需要将它与 HSM 一起使用并且它仅支持 OpenSSL 引擎,则需要考虑另一件事。但是现在大多数 HSM 都带有 JAR 文件以适应 JCE/JCA
【解决方案4】:

每个人都在谈论 BouncyCastle,但在我们的用例中,Gnu Crypto 库赢得了胜利。本机java。

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

【讨论】:

    【解决方案5】:

    有很多用于加密的 Java 原生库。但是,它们通常完全无法与 OpenSSL 互操作,有时速度明显较慢(请参阅下面网站上的指标),并且并非在所有平台上都受支持。几乎所有平台都绝对支持 OpenSSL,并且通常具有高性能。

    话虽如此,使用基于 VM 的加密具有一些安全优势。这也应该是一个考虑因素。

    Apache 小组为 Java 构建了一个库,该库使用 JNI 访问 openssl 以进行 AES 加密。我认为这是使用JNI访问openssl的最佳公开示例,您可以使用maven轻松引用它。

    https://github.com/apache/commons-crypto

    如果你愿意,你可以拉出库的 JNI 绑定部分并实现你需要的功能。

    这个 makefile 展示了如何使用 javah 从 .class 中获取构建 .c 代码所需的内容:

    https://github.com/apache/commons-crypto/blob/master/Makefile

    具体来说,Makefile 中的这一行调用 javah:$(JAVAH) -force -classpath $(TARGET)/classes -o $@ org.apache.commons.crypto.cipher.OpenSslNative 以根据 OpenSslNative.class 生成正确的“OpenSslNative.h”文件。

    https://github.com/apache/commons-crypto/blob/master/src/main/java/org/apache/commons/crypto/cipher/OpenSslNative.java

    注意import java.nio.ByteBuffer; 是如何用于允许 C 输出缓冲区的。

    相关的.c程序在这里:

    https://github.com/apache/commons-crypto/blob/master/src/main/native/org/apache/commons/crypto/cipher/OpenSslNative.c

    它在编写时考虑了跨平台支持,是一个很好的例子。每个导出的函数都必须以JNIEXPORT 开头,您可以在每个函数名称中看到完整的类路径。

    我见过很多糟糕的 JNI 绑定、传递字符串等等。从坚实的基础开始,对于在 Java 中构建良好的 OpenSSL 集成大有帮助。

    【讨论】:

      【解决方案6】:

      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 版本的功能。

      【讨论】:

      • 我想使用 OpenSSL 在我的 java 项目中构建 PKI,是否建议使用 tomcat native 构建 PKI?
      【解决方案7】:

      您可以在java\jdk\jre\bin 目录中使用keytool java 工具。

      【讨论】:

        猜你喜欢
        • 2016-02-07
        • 2019-02-15
        • 2013-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-31
        • 2012-03-15
        相关资源
        最近更新 更多