java - SunJCE 与 OpenSSL

标签 java ssl java-native-interface tls1.2

最近我用 OpenSSLJCE 替换了 SunJCE,OpenSSLJCE 是一个私有(private)包,它使用 Openssl 原语( native 库)实现 JCE 以进行 TLS 终止。

使用 OpenSSLJCE 观察到性能提高了约 35%。

我的问题是,

  1. 这种性能提升的原因是什么?仅仅是因为 openssl 是在 native 代码中执行的吗?

  2. 我认为SunJCE正在解密(TLS终止)java堆中的内容,而原生Openssl需要将内容复制到处理堆然后解密内容并将其发送回java堆,这涉及到两个副本。我的理解正确吗?

请提供您的建议和引用。

最佳答案

我将尝试通过提供我的示例来回答您的第一个问题。我创建了一个 JMeter 测试来创建与 Java 应用程序的 TLS 连接。随着负载的增加,Java 应用程序在处理 TLS 握手方面面临着巨大的挑战,因为这对于 Java 来说似乎是一个非常昂贵的操作。我在同一硬件上运行了另一个测试,其中 Nginx 负责终止与 Java 应用程序的 TLS 和代理 TCP 连接。 Nginx(使用 OpenSSL)在处理相同的负载时完全没有问题。

OpenSSL 肯定使用硬件加速来进行加密处理。

下面的文章比较了不同JCE的性能以及硬件加速的作用:https://developer.ibm.com/javasdk/2018/02/16/performance-ibm-jdk-security-ibmjceplus/

关于java - SunJCE 与 OpenSSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42432315/

相关文章:

java - 网络论坛小程序可以在小程序查看器中运行,但不能在浏览器中运行

java - 获取 GridBagLayout 单元格的像素尺寸

java - 为什么带有显式返回的空 lambda 和构造函数会导致编译器错误(Java Bug?)

PHP 和 SSL : How can I retrieve "detailed" validation results for remote site's certificate?

java - 更改后找不到.dylib文件 `java.library.path`

java - Qt for Android - startActivityForResult 等效项不起作用

java - Java 世界中有可变键长的 Map 吗?

docker - 如何使用自签名证书通过 TLS 将 Docker 应用程序包推送到私有(private)注册表

iOS - 如何将服务器证书获取到 iOS 客户端钥匙串(keychain)中以进行固定

android - 如何在 Android 开发中使用 JNI 将位图从 Java 传递到 C++?