wolfSSL/wolfssljni

GitHub: wolfSSL/wolfssljni

wolfSSL 的 Java JSSE 提供者与 JNI 封装库,旨在为 Java 和 Android 应用引入轻量级、高性能且符合 FIPS 标准的原生 TLS 1.3 加密能力。

Stars: 72 | Forks: 42

# wolfSSL JSSE Provider 和 JNI 封装器 本软件包为以下软件提供 Java 支持: [wolfSSL embedded SSL/TLS library](https://www.wolfssl.com/products/wolfssl/), 使应用程序能够支持最高至当前 [TLS 1.3](https://www.wolfssl.com/tls13) 协议级别的 SSL/TLS。 它包含一个 wolfSSL **JSSE** (Java Secure Socket Extension) provider, 名为 **wolfJSSE**,以及一个封装原生 C 库的基于 JNI 的轻量级接口。 wolfSSL 还提供一个 **JCE** (Java Cryptography Extension) provider, 封装了原生的 wolfCrypt。该 Provider 可在一个单独的仓库中找到,位于 [此处](https://github.com/wolfSSL/wolfcrypt-jni)。 ## 为什么使用 wolfJSSE? 该接口使 Java 应用程序能够获得使用 wolfSSL 的所有优势,包括当前最高至 [TLS 1.3](https://www.wolfssl.com/tls13) 的 SSL/TLS 标准、 [FIPS 140-2 和 140-3](https://www.wolfssl.com/license/fips/) 支持、 性能优化、硬件加密支持、 [商业支持](https://www.wolfssl.com/products/support-and-maintenance/) 等等! ## 用户手册 wolfSSL JNI/JSSE 手册可在 wolfSSL 网站上获取: [wolfSSL JNI 手册](https://www.wolfssl.com/documentation/manuals/wolfssljni/)。 有关额外的构建说明和更详细的注释,请参阅该手册。 ## 构建 wolfJSSE 目前支持在以下平台上编译: - Linux/Unix - Mac OSX - [Windows (Visual Studio)](./IDE/WIN/README.md) - Android Studio - Android AOSP 要使用 Visual Studio 在 Windows 上构建 wolfJSSE,请参阅 Windows [README.md](./IDE/WIN/README.md)。 ## 构建原生 wolfSSL (依赖项) 要编译 wolfSSL JNI 封装器和 JSSE provider,首先必须编译并安装原生 (C) wolfSSL 库。 要在 Linux/Unix 环境中构建 wolfJSSE,首先下载、编译并安装 wolfSSL。 wolfSSL 可从 wolfSSL [下载页面](https://www.wolfssl.com/download/) 下载,或从 [GitHub](https://github.com/wolfssl/wolfssl) 克隆。 ``` $ unzip wolfssl-X.X.X.zip $ cd wolfssl-X.X.X $ ./configure --enable-jni $ make check $ sudo make install ``` 如果构建 wolfSSL FIPS 或 FIPS Ready 发布包,可能需要额外的配置选项。 请参阅 wolfSSL 手册和构建文档以获取确切的构建说明。 ## 使用 make/ant 构建和测试 wolfSSL JNI/JSSE 的 ant 构建是最稳定且经过充分测试的。 同时也新增了对使用 Maven 构建的支持。请参阅下文关于使用 Maven 构建的说明。 `Makefile` 编译原生 JNI 共享库 (`libwolfssljni.so`/`libwolfssljni.dylib`) 并调用 `ant` 构建 Java 源码。如果尚未设置 `JAVA_HOME`,它将自动检测。要显式指定 Java 安装路径, 请在运行 `make` 之前设置 `JAVA_HOME`。 Make 目标: * **make** / **make build** - 编译原生 JNI 库和 Java 源码 (JAR) * **make check** - 构建并运行 JUnit 测试 (需要 `JUNIT_HOME`) * **make native** - 仅编译原生 JNI 共享库 * **make clean** - 清理所有 Java 和原生产物 * **make clean-native** - 仅清理原生产物 (`.o`, `.d`, 共享库) * **make install** - 安装共享库和 JAR 包 * **make uninstall** - 删除已安装的文件 也提供仅限 Ant 的目标: * **ant build (ant)** - 仅构建 JAR * **ant test** - 构建并运行测试 (需要 JUNIT 设置) * **ant examples** - 构建示例 * **ant clean** - 清理 Java 产物 * **ant cleanjni** - 清理原生产物 要构建 wolfJSSE: ``` $ cd wolfssljni $ export JUNIT_HOME=/path/to/junit/jars $ make build $ make check ``` 可以将自定义的 wolfSSL 安装目录和库名称传递给 `make`: ``` $ make WOLFSSL_INSTALL_DIR=/path/to/wolfssl WOLFSSL_LIBNAME=wolfssljsse ``` 设置 `V=1` 以查看完整的编译器命令: ``` $ make V=1 ``` 设置 `ENABLE_PATCHES=1` 以自动检测并启用依赖于 wolfSSL pull request 补丁的 JNI 代码 (`WOLFSSL_PR*_PATCH_APPLIED` 定义)。 这会启用自上次官方 wolfSSL 构建以来新增功能的功能和测试覆盖率。 **注意:** 这需要包含该 PR 的最新 wolfSSL 构建,通常 比最新的带标签发布版本要新。 ``` $ make ENABLE_PATCHES=1 ``` 要编译并运行示例,请使用 `ant examples` 目标: ``` $ ant examples ``` 然后,使用提供的封装脚本从根目录运行示例: ``` $ ./examples/provider/ServerJSSE.sh $ ./examples/provider/ClientJSSE.sh ``` ### java.sh 脚本 `java.sh` 脚本是 Makefile 的一个便捷封装器,它将 原生 JNI 源码编译为名为 `libwolfssljni.so` (Linux/Unix) 或 `libwolfssljni.dylib` (MacOS) 的共享库。它调用 `make clean-native` ,然后调用 `make native`,每次都执行原生库的干净重建。 该脚本接受两个可选参数: 1. **wolfSSL 安装目录** (默认: `/usr/local`) - 应与 wolfSSL `./configure --prefix=` 中设置的目录一致。 2. **wolfSSL 库名称** (默认: `wolfssl`) - 如果使用了非标准 库名称,例如通过 `./configure --with-libsuffix`,则此参数很有用。 例如,如果 wolfSSL 配置时使用了 `--with-libsuffix=jsse`,那么 使用默认安装路径 `/usr/local` 调用此脚本的方式如下: ``` java.sh /usr/local wolfssljsse ``` 可以在运行脚本之前在环境中设置 `CFLAGS`: ``` CFLAGS=-DWOLFJNI_USE_IO_SELECT java.sh ``` ## 使用 Maven 构建 wolfJSSE 支持使用 Maven 进行构建和打包,适用于那些 已经设置好使用和消费 Maven 包的项目。 wolfJSSE 的 Maven 构建配置定义在包含的 `pom.xml` 中。 首先,编译原生 JNI 共享库。这将 在 `./lib` 目录下创建原生 JNI 共享库: ``` $ make native ``` 编译 Java 源码,Maven 会将编译后的 `.class` 文件 放在 `./target/classes` 目录下: ``` $ mvn compile ``` 使用以下命令编译并运行 JUnit 测试: ``` $ mvn test ``` 使用以下命令打包 wolfSSL JNI/JSSE JAR 文件。这将 运行 JUnit 测试,然后在 `./target` 目录下创建一个 `.jar` 文件,类似于 `target/wolfssl-jsse-X.X.X-SNAPSHOT.jar`: ``` $ mvn package ``` 要为 wolfSSL JNI/JSSE 构建 Javadoc API 参考,请运行以下命令。这将 在 `./docs/apidocs` 目录下生成 Javadoc HTML: ``` $ mvn javadoc:javadoc ``` 要安装 wolfSSL JNI/JSSE JAR 文件,请运行以下命令。这将 把 JAR 安装到本地 Maven 仓库: ``` $ mvn install ``` 本地 Maven 仓库安装位置类似于: ``` ~/.m2/repository/com/wolfssl/wolfssl-jsse/X.X.X-SNAPSHOT/wolfssl-jsse-X.X.X-SNAPSHOT.jar ``` wolfSSL JNI 共享库 (`libwolfssljni.so/dylib`) 需要被 “安装”,即放置在您的原生 库搜索路径中。例如,复制到 `/usr/local/lib`、`/usr/lib` 或其他位置。或者,通过导出 `LD_LIBRARY_PATH` (Linux) 或 `DYLD_LIBRARY_PATH` (OSX) 将 `./lib` 目录追加到您的原生 库搜索路径: ``` $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/wolfssljni/lib ``` 在将 wolfSSL JNI/JSSE 安装到本地 Maven 仓库后, 应用程序可以将其作为依赖项包含在应用程序的 `pom.xml` 文件中,类似于: ``` ... com.wolfssl wolfssl-jsse 1.16.0-SNAPSHOT ... ``` ## Java 9+ 模块支持 (JPMS) wolfSSL JNI/JSSE 支持 Java 9 引入的 Java Platform Module System (JPMS)。 这允许该库与 `jlink` 一起使用以创建自定义 Java 运行时。 ### 工作原理 构建系统使用条件编译,仅在 使用 Java 9 或更高版本构建时包含模块支持: | 用于构建的 JDK | 生成的 JAR | | --- | --- | | Java 8 | 标准 JAR (仅 classpath) | | Java 9+ | 模块化 JAR (同时适用于 classpath 和 module path) | 当使用 Java 9+ 构建时,JAR 中会包含一个 `module-info.class`,它: - 将模块声明为 `com.wolfssl` - 导出 `com.wolfssl` 和 `com.wolfssl.provider.jsse` 包 - 将 `WolfSSLProvider` 注册为 `java.security.Provider` 服务 ### 构建模块化 JAR 要构建模块化 JAR,只需在构建时使用 Java 9 或更高版本。Ant 和 Maven 构建均支持自动编译 module-info。 **使用 Ant:** ``` $ export JAVA_HOME=/path/to/jdk11 # or any JDK 9+ $ make build ``` **使用 Maven:** ``` $ export JAVA_HOME=/path/to/jdk11 # or any JDK 9+ $ make native $ mvn package ``` Maven 使用一个配置文件 (`java9-module`),该文件在 Java 9+ 上自动激活 以编译并在 JAR 中包含 `module-info.class`。 您可以使用以下命令验证模块支持: ``` $ jar --describe-module --file=lib/wolfssl-jsse.jar com.wolfssl jar:file:///path/to/lib/wolfssl-jsse.jar/!module-info.class exports com.wolfssl exports com.wolfssl.provider.jsse requires java.logging provides java.security.Provider with com.wolfssl.provider.jsse.WolfSSLProvider ``` ### 与 jlink 一起使用 使用 Java 9+ 构建后,JAR 可与 `jlink` 一起使用以创建自定义 Java 运行时: ``` $ jlink \ --module-path lib/wolfssl-jsse.jar \ --add-modules com.wolfssl \ --output custom-runtime \ --no-header-files \ --no-man-pages ``` 这将创建一个包含 wolfJSSE 的最小 Java 运行时,该运行时可 独立部署。 ### Java 8 兼容性 Java 8 用户仍然可以正常构建和使用 wolfSSL JNI/JSSE。当使用 Java 8 构建时,`module-info.java` 会自动从编译中排除, 生成的 JAR 作为标准 classpath JAR 工作。 ## 示例 使用 wolfssljni 的示例可在 `./examples` 子目录中找到。 详情请参阅 [examples/README.md](./examples/README.md)。 使用 wolfJSSE provider 的示例可在 `./examples/provider` 子目录中找到。详情请参阅 [examples/provider/README.md](./examples/provider/README.md)。 此包中包含了示例证书和密钥。这些仅应 用于测试和原型设计。此处包含的示例证书是 随标准 wolfSSL 附带的证书的副本。如果需要,可以使用脚本 **examples/certs/update-certs.sh** 从现有的 wolfSSL 目录轻松更新证书。 此脚本应从 examples/certs 目录运行,并指定一个参数,即 wolfSSL certs 目录的路径。 ## 调试 wolfSSL JNI/JSSE 支持多个系统属性以启用调试 日志记录。下表描述了当前支持的调试属性 及其各自启用的功能。 | System Property | Default | To Enable | Description | | --- | --- | --- | --- | | wolfssl.debug | "false" | "true" | 启用原生 wolfSSL 调试日志 | | wolfssljni.debug | "false" | "true" | 启用 wolfJNI 调试日志 | | wolfjsse.debug | "false" | "true | 启用 wolfJSSE 调试日志 | | wolfjsse.debugFormat | | "JSON" | 切换调试输出格式 | | wolfsslengine.debug | "false" | "true" | 启用 SSLEngine 调试日志 | | wolfsslengine.io.debug | "false" | "true" | 启用 SSLEngine I/O 字节日志 | 原生 wolfSSL 日志 (`wolfssl.debug`) 仅在 原生 wolfSSL 使用 `--enable-debug` 配置时才会输出消息。 这些系统属性可以在运行时定义,例如: ``` java -Dwolfjsse.debug=true App ``` 或者这些系统属性也可以在运行时通过编程方式设置,例如: ``` System.setProperty("wolfjsse.debug", "true"); System.setProperty("wolfsslengine.debug", "true); ``` 如果 wolfSSL JNI/JSSE 调试系统属性在 WolfSSLDebug 类已经初始化/使用后在运行时被更改,应用程序需要 刷新 WolfSSLDebug 类内的调试属性值。为此, 在设置系统属性后,调用: ``` WolfSSLDebug.refreshDebugFlags() ``` 可以使用 `-Djavax.net.debug=all` 选项启用 JDK 调试日志。 ### JSON 日志消息格式 调试消息可以 JSON 格式输出,供 DataDog 等工具使用。 将以下系统属性设置为 "JSON" 将导致所有调试 消息以 JSON 格式打印,而不是默认的文本输出: ``` System.setProperty("wolfjsse.debugFormat", "JSON"); ``` 这也可以在命令行上运行时指定,如下所示: ``` -Dwolfjsse.debug=true -Dwolfjsse.debugFormat=JSON ``` 以 JSON 格式输出时,调试消息看起来类似于以下内容: ``` { "@timestamp": "2025-04-05 11:13:07.193", "level": "INFO", "logger_name": "wolfJSSE", "message": "[ WolfSSLTrustManager] entered engineInit()", "thread_name": "main",: "thread_id": "1" } ``` ## 为 Android 构建 wolfSSL JNI 和 JSSE 可以在 Android 平台上构建和使用,可以 在应用程序级别,也可以安装在修改版 Android AOSP 中的系统级别。 ### Android 应用程序级别使用 本包中包含一个 Android Studio 应用程序示例,以向 用户展示如何将 wolfSSL 原生和 wolfSSL JNI/JSSE 源码 包含在 Android Studio 应用程序中。有关更多详细信息,请参阅位于 [./IDE/Android](./IDE/Android) 目录中的 Android Studio 项目和 README.md。 在应用程序级别使用 wolfJSSE 将允许开发者将 wolfJSSE 注册为应用程序作用域的 Security provider。应用程序可以 使用 Java Security API 进行 SSL/TLS 操作,这些操作随后将使用 底层的 wolfJSSE provider(以及随后的原生 wolfSSL)。 应用程序可以使用以下代码注册 wolfJSSE provider: ``` import com.wolfssl.provider.jsse.WolfSSLProvider; ... Security.addProvider(new WolfSSLProvider()); ``` 要将 WolfSSLProvider 插入为最高优先级的 provider,或在 指定索引处(注意:索引从 1 开始): ``` import com.wolfssl.provider.jsse.WolfSSLProvider; ... Security.insertProviderAt(new WolfSSLProvider(), 1); ``` 在 [wolfsslamples](https://github.com/wolfssl/wolfssl-examples/tree/master/android) 仓库中还有 使用 wolfSSL JNI 的额外 Android 示例。 ### Android AOSP 系统级别安装 wolfJSSE 可以安装在 Android AOSP 构建中,并在 OS/系统级别注册。这将允许 wolfJSSE 注册为 Android 上最高 优先级的 JSSE provider,从而允许任何使用 Java Security API 的应用程序自动使用 wolfJSSE 和 wolfSSL。 有关如何在 Android AOSP 中安装 wolfJSSE 的详细信息,请参阅位于 [./platform/android_aosp](./platform/android_aosp) 目录中的 README。 可以在 wolfSSL.com 网站上找到其他说明: [在 Android OSP 中安装 JSSE Provider](https://www.wolfssl.com/docs/installing-a-jsse-provider-in-android-osp/)。 ## 行为和功能说明 ### JSSE 类实现支持 wolfJSSE 扩展或实现了以下 JSSE 类。请注意, SSLContext `DTLSv1.3` 支持仅通过 `SSLEngine` 接口支持。 - javax.net.ssl.SSLContextSpi - SSL, TLS, DEFAULT, TLSv1, TLSv1.1, TLSv1.2, TLSv1.3, DTLSv1.3 - javax.net.ssl.KeyManagerFactorySpi - PKIX, X509, SunX509 - javax.net.ssl.TrustManagerFactorySpi - PKIX, X509, SunX509 - javax.net.ssl.SSLEngine - javax.net.ssl.SSLSession / ExtendedSSLSession - javax.net.ssl.X509KeyManager / X509ExtendedKeyManager - javax.net.ssl.X509TrustManager / X509ExtendedTrustManager - javax.net.ssl.SSLServerSocket - javax.net.ssl.SSLServerSocketFactory - javax.net.ssl.SSLSocket - javax.net.ssl.SSLSocketFactory - javax.net.ssl.SSLSessionContext - java.security.cert.X509Certificate - javax.security.cert.X509Certificate ### 安全重协商支持 wolfSSL JNI 和 JSSE provider 封装了原生 wolfSSL API 以启用和进行 安全重协商。要在 wolfSSL JNI 中使用安全重协商功能, 并在 wolfJSSE 中启用它,原生 wolfSSL 必须 在编译时启用安全重协商支持: ``` $ ./configure --enable-secure-renegotiation ``` 或者通过定义 `-DHAVE_SECURE_RENEGOTIATION`。 ### 原生文件描述符事件 wolfSSL JNI/JSSE 在内部多次调用操作 Java Socket 对象内部原生 文件描述符的函数。这些原生文件描述符 通过 `select()` 或 `poll()` 监视读取和写入事件。 默认情况下将使用 `poll()`,除非定义了 `WOLFJNI_USE_IO_SELECT` 或在编译原生 JNI 源码时将其添加到 CFLAGS(例如 `make CFLAGS=-DWOLFJNI_USE_IO_SELECT`)。 Windows 构建也将默认使用 `select()`,因为 `poll()` 在那里不可用。 wolfSSL JNI/JSSE 不会 select/poll 大量文件描述符 (通常只有一个)。尽管如果在建立大量连接的应用程序中使用, 当使用 `select()` 时,如果文件描述符编号大于 `FD_SETSIZE`(在大多数系统上默认为 1024),`FD_ISSET` 和其他相关宏 会导致未定义的行为。因此,`poll()` 被 用作默认的描述符监视函数。 ### Security 属性支持 wolfJSSE 允许通过 `java.security` 文件 和使用 Security 属性进行一些自定义。 #### 预先存在的 Java Security 属性 支持以下预先存在的 Java Security 属性。 | System Property | Default | To Enable | Description | | --- | --- | --- | --- | | keystore.type | JKS | String | 指定默认的 KeyStore 类型 | | jdk.tls.disabledAlgorithms | | String | 禁用算法、TLS 协议版本和密钥长度 | **keystore.type (String)** - 指定默认的 KeyStore 类型。默认值为 JKS,但可以根据需要设置为其他值。 **jdk.tls.disabledAlgorithms (String)** - 可用于禁用算法、 TLS 协议版本和密钥长度等。这应该是 一个以逗号分隔的 String。wolfJSSE 包含对此属性的部分支持, 支持的项目包括禁用 SSL/TLS 协议版本和设置 最小 RSA/ECC/DH 密钥大小。潜在用法示例: ``` jdk.tls.disabledAlgorithms=SSLv3, TLSv1.1, DH keySize < 1024, EC keySize < 224, RSA keySize < 1024 ``` #### wolfSSL JNI/JSSE 特定的 Security 属性 支持以下自定义 wolfSSL JNI/JSSE 特定的 Security 属性设置。 这些可以放入 `java.security` 文件中,并由 wolfSSL JNI/JSSE 解析和使用。 | System Property | Default | To Enable | Description | | --- | --- | --- | --- | | wolfssl.readWriteByteBufferPool.disabled | "false" | "true" | 禁用读/写 ByteBuffer 池 | | wolfssl.readWriteByteBufferPool.size | 16 | Integer | 设置读/写每线程 ByteBuffer 池大小 | | wolfssl.readWriteByteBufferPool.bufferSize | 17408 | String | 设置读/写每线程 ByteBuffer 大小 | | wolfjsse.enabledCipherSuites | | String | 限制启用的密码套件 | | wolfjsse.enabledSupportedCurves | | String | 限制启用的 ECC 曲线 | | wolfjsse.enabledSignatureAlgorithms | | String | 限制启用的签名算法 | | wolfjsse.keystore.type.required | | String | 限制 KeyStore 类型 | | wolfjsse.clientSessionCache.disabled | | "true" | 禁用客户端会话缓存 | | wolfjsse.X509KeyManager.disableCache | "false" | "true" | 禁用 X509KeyManager KeyStore 条目缓存 | | wolfjsse.skipFIPSCAST | "false" | "true" | 在 wolfJSSE 初始化期间跳过 FIPS CAST | **wolfssl.readWriteByteBufferPool.disabled (String)** - 可用于禁用 com.wolfssl.WolfSSLSession 中用于原生 JNI wolfSS\_read() 和 wolfSSL\_write() 调用的静态每线程 ByteBuffer 池。此池用于 在使用字节数组偏移量时防止 JNI 级别的非对齐内存访问。此池 默认启用,除非通过将此属性设置为 "true" 显式禁用: ``` wolfssl.readWriteByteBufferPool.disabled=true ``` **wolfssl.readWriteByteBufferPool.size (Integer)** - 可用于设置 最大每线程 ByteBuffer 池大小。这是将分配并添加到池中的 直接 ByteBuffer 对象的最大数量。池 从大小 0 开始,然后根据需要增长到此最大大小。 默认值为 16。应将其设置为正整数值: ``` wolfssl.readWriteByteBufferPool.size=16 ``` **wolfssl.readWriteByteBufferPool.bufferSize (String)** - 可用于设置 静态每线程 WolfSSLSession 池中每个直接 ByteBuffer 的大小。 默认设置为 17k (17 * 1024),这允许最大 SSL/TLS 记录大小为 2^14 (16k) 加上一些额外的记录头 开销空间。应将其设置为正整数值。如果已知 应用程序读取/写入的数据大小,这可用于优化性能。 如果大小设置得当,在 com.wolfssl.WolfSSLSession 的 read() 和 write() 方法内部调用原生 `wolfSSL_read()` 和 `wolfSSL_write()` 时, 所需的读/写循环次数将减少。 ``` wolfssl.readWriteByteBufferPool.bufferSize=17408 ``` **wolfjsse.enabledCipherSuites (String)** - 允许将启用的 密码套件限制为此 Security 属性中列出的套件。设置后,应用程序 将无法在运行时覆盖或添加额外的套件,除非 更改此属性。这应该是以逗号分隔的 String。用法示例: ``` wolfjsse.enabledCipherSuites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 ``` **wolfjsse.enabledSupportedCurves (String)** - 允许设置 SSL/TLS 连接 要启用的特定 ECC 曲线。这将向下传递给原生 wolfSSL API `wolfSSL_UseSupportedCurve()`。如果在处理此属性时发现 无效/错误值,连接建立将失败并抛出 SSLException。这应该是以逗号分隔的 String。用法示例: ``` wolfjsse.enabledSupportedCurves=secp256r1, secp521r1 ``` **wolfjsse.enabledSignatureAlgorithms (String)** - 允许限制 在 TLS ClientHello 签名算法扩展中发送的 签名算法。通过使用/设置此属性,原生 wolfSSL 将不会 使用默认值填充该扩展,默认值基于已 编译到原生 wolfSSL 库中的算法。这应该是 以逗号分隔的签名算法 + MAC 组合 String。用法示例: ``` wolfjsse.enabledSignatureAlgorithms=RSA+SHA256:ECDSA+SHA256 ``` **wolfjsse.keystore.type.required (String)** - 可用于指定必须 使用的 KeyStore 类型。如果设置了此项,wolfJSSE 将不允许使用 任何非此类型的 KeyStore 实例。此选项的一个用途是 在将 wolfCrypt FIPS 140-2/3 与注册为 JCE provider 的 wolfJCE 一起使用时。 此选项可用于限制使用 wolfJCE 的 "WKS" KeyStore 类型, 以帮助确保符合使用 FIPS 验证加密的要求。其他 非 wolfJCE KeyStore 实现可能不使用/消费 FIPS 验证的加密。 **wolfjsse.clientSessionCache.disabled (String)** - 可用于禁用 Java 客户端会话缓存。禁用此功能将导致客户端会话 恢复不再生效,使所有连接回退到完全 握手。如果要禁用 Java 客户端会话缓存,应将其 设置为 String "true"。不需要将其设置为“启用” 缓存。Java 客户端缓存默认启用。 ``` wolfjsse.clientSessionCache.disabled=true ``` **wolfjsse.X509KeyManager.disableCache (String)** - 可用于禁用 WolfSSLKeyX509 (X509ExtendedKeyManager) 实现中的 KeyStore 条目缓存。 当设置为 "true" 时,X509KeyManager 将恢复为原始行为, 即直接为每个操作调用 KeyStore 方法,而不是使用缓存 条目。这对于调试、兼容性测试或 KeyStore 内容可能动态变化的情况很有用。 默认情况下启用缓存以提高性能。应将其设置为 String "true" 以禁用缓存: ``` wolfjsse.X509KeyManager.disableCache=true ``` **wolfjsse.skipFIPSCAST (String)** - 可用于跳过 FIPS CAST (条件 算法自测) 在 wolfJSSE 初始化期间的前置执行。这 在同时使用 WolfSSLProvider (wolfJSSE) 和 WolfCryptProvider (wolfJCE) 以及 wolfCrypt FIPS 时很有用。这两个 provider 都会在 初始化期间运行所有 CAST,如果在不同线程上并发执行,可能 会导致 `FIPS_NOT_ALLOWED_E` 错误。将此设置为 "true" 允许应用程序 在注册 provider 之前通过 wolfJCE 的 `Fips.runAllCast_fips()` 运行一次 CAST, 从而避免重复的 CAST 执行。必须在构造 `WolfSSLProvider` 之前设置: ``` wolfjsse.skipFIPSCAST=true ``` 如果您想在 wolfJSSE 中使用其他 Security 属性, 请联系 support@wolfssl.com。 ### System 属性支持 wolfJSSE 允许通过使用系统属性进行一些自定义。由于 这些是 **System** 属性而不是 **Security** 属性,如果 放置在 `java.security` 文件中,它们将不会被读取。该文件仅 与/用于 Security 属性(见上一节)。 **javax.net.ssl.keyStore (String)** - 可用于指定 KeyManager 对象 要使用的 KeyStore 文件。这是在运行时通过编程方式传入 KeyStore 文件 的替代方法。 **javax.net.ssl.keyStoreType (String)** - 可用于指定在 KeyManager 对象内部获取 KeyStore 实例时要使用的 KeyStore 类型。 **javax.net.ssl.keyStorePassword (String)** - 可用于指定 用于初始化 KeyManager 实例的 KeyStore 密码。 **javax.net.ssl.trustStore (String)** - 可用于指定 TrustManager 对象 要使用的 KeyStore 文件。这是在运行时通过编程方式传入 KeyStore 文件的替代方法。 **javax.net.ssl.trustStoreType (String)** - 可用于指定在 TrustManager 对象内部加载 KeyStore 时要使用的 KeyStore 类型。 **javax.net.ssl.trustStorePassword (String)** - 可用于指定 在 TrustManager 对象内部加载 KeyStore 时要使用的 KeyStore 密码。 **jdk.tls.client.enableSessionTicketExtension (boolean)** - Session ticket 的启用方式取决于 JDK 实现。对于 Oracle/OpenJDK 及其变体,此系统属性启用 session ticket 并 在 Java 13 中添加。应设置为 "true" 以启用。 **jdk.tls.server.SignatureSchemes (String)** - 控制如果设置后服务器 通告和使用的签名算法。 **jdk.tls.client.SignatureSchemes (String)** - 控制如果设置后客户端 通告和使用的签名算法。 **jdk.tls.useExtendedMasterSecret (boolean)** - 可用于启用或 禁用 Extended Master Secret (EMS) 扩展的使用。此扩展 默认启用,除非通过将此属性设置为 false 显式禁用。 **wolfjsse.autoSNI (boolean)** - 控制基于主机名或对等地址的自动 Server Name Indication (SNI) 扩展设置。当设置为 "true" 时,启用 旧有行为,即即使没有显式的 SSLParameters 配置,SNI 也会 根据主机名/对等信息自动配置。默认值为 "false",即 仅在通过 SSLParameters 显式配置时才设置 SNI。 **wolfssl.skipLibraryLoad (boolean)** - 当设置为 "true" 时,`wolfSSL.loadLibrary()` 将跳对原生 wolfSSL 和 wolfSSL JNI 库的默认 `System.loadLibrary()` 调用。 这在应用程序需要使用自定义逻辑自行加载原生 库时很有用,例如将原生库捆绑在 JAR 文件中并在运行时提取时。 该属性必须在调用 `wolfSSL.loadLibrary()` 之前设置, 可以是直接调用或通过 `WolfSSLProvider()` 构造函数调用。 应用程序可以通过调用 `wolfSSL.isLibraryLoadSkipped()` 来检查库加载是否被 跳过。 通过命令行设置: ``` java -Dwolfssl.skipLibraryLoad=true ... ``` 在库加载前通过编程方式设置: ``` System.setProperty("wolfssl.skipLibraryLoad", "true"); /* Load native libraries with custom logic here */ System.load("/path/to/libwolfssl.so"); System.load("/path/to/libwolfssljni.so"); /* Then use wolfSSL as normal */ wolfSSL.loadLibrary(); ``` 如果您想在 wolfJSSE 中使用其他 System 属性, 请联系 support@wolfssl.com。 ## 发布说明 发布说明可在 [ChangeLog.md](./ChangeLog.md) 中找到。 ## 支持 有关支持咨询和反馈,请联系 support@wolfssl.com。
标签:Android开发, FIPS 140-2, JNI, JSSE, JS文件枚举, SSL/TLS, TLS 1.3, wolfSSL, Wrapper, 加密库, 域名枚举, 套接字, 密码学, 嵌入式安全, 开源库, 手动系统调用, 搜索引擎爬虫, 网络安全, 通信安全, 隐私保护