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, 加密库, 域名枚举, 套接字, 密码学, 嵌入式安全, 开源库, 手动系统调用, 搜索引擎爬虫, 网络安全, 通信安全, 隐私保护