关于JAVA Springboot集成支付后打包JAR之后报安全错误的处理

错误内容: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 官方推荐的方式

创建一个启动类,在应用启动前设置系统属性:

  1. 创建 SecurityProviderInitializer.java:
  1. 在 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"]
相关推荐
阿俊-全栈开发28 分钟前
LikeShop 单商户SaaS商城分销模块二开:佣金计算与结算逻辑实现
java·开发语言·微服务·likeshop·likeshop开源商城·likeshop多商户
wuminyu4 小时前
C++协程实现接收端的零拷贝Buffer管理原理剖析
java·linux·c语言·jvm·c++
Zhou1411365 小时前
SpringBoot_03_Web开发
前端·spring boot·python
蜗牛互联网6 小时前
WSL Containers GA:本地AI容器的生命周期、网络与治理验收
java·网络·人工智能·后端
龙亘川6 小时前
铭记英烈守初心,数字强基促服务:亘川智城退役军人服务系统的实践与价值
java·数据库·人工智能
OxYGC7 小时前
[AI工程] Spring AI 第廿一篇:存量 REST 接口的 MCP 化改造实录——工具从哪条路径注册、参数描述怎么写、身份怎么过去
java·人工智能·spring
Zhou1411367 小时前
SpringBoot_02_自动配置原理
java·spring boot·后端
FYKJ_20107 小时前
SSM校园失物招领系统41452-计算机课程设计、毕业设计
java·vue.js·spring boot·python·mysql·typescript·spark
kv1107 小时前
Android studio国内开发有关
java·数据库·android studio
卓怡学长8 小时前
w198基于springboot始于足下健康打卡平台的设计与实现
java·spring boot·spring·intellij-idea