错误内容:java.lang.SecurityException: JCE cannot authenticate the provider BC
这是典型的 JDK 17+ 安全策略导致的 Bouncy Castle 提供者验证失败问题。
解决方案挺多的,第一种和第二种是我目前用的。其他的可自行参考:
方案一:修改 Maven/Gradle 插件配置(推荐)
对于 Maven (Spring Boot):
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
<mainClass>com.xxx.Application</mainClass>
<!-- 添加JVM参数 -->
<jvmArguments>
-Dcom.sun.net.ssl.checkRevocation=false
-Djava.security.disableSystemScopeFile=true
-Dsun.security.validator=allow
</jvmArguments>
</configuration>
</plugin>
对于 Gradle (Spring Boot):
bootJar {
launchScript {
properties = [
'jvmArguments': '-Dcom.sun.net.ssl.checkRevocation=false -Djava.security.disableSystemScopeFile=true -Dsun.security.validator=allow'
]
}
}
方案二:修改启动参数
/www/server/java/jdk-17.0.12/bin/java -jar \
-Xmx1024M \
-Xms256M \
-Dcom.sun.net.ssl.checkRevocation=false \
-Djava.security.disableSystemScopeFile=true \
-Dsun.security.validator=allow \
/home/java/apis1.2.3.jar
然后修改你的 Dockerfile 或部署脚本使用此脚本启动。
方案三:创建 systemd 服务文件
如果你使用 systemd 管理服务:
[Unit]
Description=My Application
After=network.target
[Service]
Type=simple
User=appuser
WorkingDirectory=/home/java
Environment="JAVA_HOME=/www/server/java/jdk-17.0.12"
ExecStart=/www/server/java/jdk-17.0.12/bin/java \
-Xmx1024M \
-Xms256M \
-Dcom.sun.net.ssl.checkRevocation=false \
-Djava.security.disableSystemScopeFile=true \
-Dsun.security.validator=allow \
-jar /home/java/apis1.2.3.jar
SuccessExitStatus=143
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
方案四:通过配置文件方式(不修改源代码)
创建 java.security.override文件:
# java.security.override
com.sun.net.ssl.checkRevocation=false
java.security.disableSystemScopeFile=true
sun.security.validator=allow
然后在启动时指定:
java -Djava.security.properties=/path/to/java.security.override -jar app.jar
方案五:使用 Bouncy Castle 官方推荐的方式
创建一个启动类,在应用启动前设置系统属性:
- 创建
SecurityProviderInitializer.java:
-
在 Spring Boot 启动类中静态导入:
@SpringBootApplication
public class Application {
static {
// 确保在所有代码之前执行
new SecurityProviderInitializer();
}public static void main(String[] args) { SpringApplication.run(Application.class, args); }}
方案六:通过环境变量(容器化部署时推荐)
在 Dockerfile 中:
FROM openjdk:17-jdk-slim
COPY target/apis1.2.3.jar /app/app.jar
ENV JAVA_OPTS="-Dcom.sun.net.ssl.checkRevocation=false -Djava.security.disableSystemScopeFile=true -Dsun.security.validator=allow"
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /app/app.jar"]