YashanDB JDBC启动java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/NoPadding

近期我们协助某金融客户做Oracle到yashanDB迁移改造的项目,有套Java应用启动时报错java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/NoPadding, 本地使用的是华为Bisheng JDK, 简单记录一下该问题分析方法

NoSuchAlgorithmException: Cannot find any provider 的根本原因是 JVM 无法找到支持指定算法的安全提供者(Provider),通常由算法名称错误、JDK 版本不兼容、FIPS 模式限制或 Provider 未注册引起。

先检查JDK版本

java -version  

如果是 JDK 8u242 及更早的版本,很可能就是这个问题, 那建议升级。

本案例是JDK 版本是 OpenJDK 1.8.0_402 (Bisheng 毕昇版)毕昇 JDK 是华为基于 OpenJDK 定制开发的,虽然它在常规场景下兼容标准 OpenJDK,但在安全加密模块(JCE)上,有时会因为华为自身的某些加固策略或默认配置,导致标准 OpenJDK 中正常的算法组合(如 AES/CBC/NoPadding)出现 Cannot find any provider 的情况。

更换Oracle JDK运行是正常的,所以排除了应用中引入其他jar包冲突。如果换了jdk也不行,检查你的应用启动脚本或 lib 目录下,是否包含了 bcprov-jdk15on-x.x.x.jar 等 Bouncy Castle 包,可能存在冲突。

问题可能是毕昇 JDK 自带的加密策略限制配置文件与YashanDB 驱动不兼容上。

检查JDK配置文件

毕昇 JDK 的 java.security 文件可能默认禁用了部分算法。

找到你的 JDK 安装目录,进入 jre/lib/security/(如果是 JDK 8)或 conf/security/

$ egrep 'disabledAlgorithms|security.provider'  bisheng-jdk1.8.0_402/jre/lib/security/java.security|egrep -v '^#'
security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=sun.security.ec.SunEC
security.provider.4=com.sun.net.ssl.internal.ssl.Provider
security.provider.5=com.sun.crypto.provider.SunJCE
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider
security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.9=sun.security.smartcardio.SunPCSC
login.configuration.provider=sun.security.provider.ConfigFile
policy.provider=sun.security.provider.PolicyFile
jdk.certpath.disabledAlgorithms=MD2, MD5, SHA1 jdkCA & usage TLSServer, \
jdk.jar.disabledAlgorithms=MD2, MD5, RSA keySize < 1024, \
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \

默认是没有jdk.xxxxxx.disabledAlgorithms 禁用AES等算法的。

检查 java.security 里的 disabledAlgorithms 配置,如果没发现异常,强烈建议直接替换为标准 OpenJDK 8 重新运行,这通常能绕过所有毕昇 JDK 特有的加密策略问题。

注意配置文件中com.sun.crypto.provider.SunJCE是注册了的, 简单来说:security.provider.5=com.sun.crypto.provider.SunJCE 是在告诉 JVM,把 SunJCE 注册为第 5 号安全提供者(Provider),专门负责提供基础的加密、解密和密钥生成算法。SunJCE(Sun Java Cryptography Extension)是 JDK 默认自带的最重要的加密服务提供者。它实现了绝大多数日常开发中使用的对称加密、非对称加密和消息摘要算法,例如:

  • 对称加密:AES、DES、DESede (3DES)、Blowfish 等。
  • 非对称加密:RSA、DSA、DH 等(部分依赖其他 Provider)。
  • 消息摘要:MD5、SHA-1、SHA-256 等。
  • 密码学算法模式与填充:CBC、ECB、GCM 模式,以及 PKCS5Padding、NoPadding 等。

如果没有这个 Provider,你的程序将无法使用 AES 加密,也无法解密 YashanDB 的密码。当然如果有些国产JDK可能使用了国密其他加密算法时,也可能不兼容或不支持。检查security.provider.列表顺序。

使用java 代码显示Provider 列表

java -XshowSettings:security -version JDK 9 及更高版本可以直接使用,当前使用的是 OpenJDK 1.8.0_402(毕昇 JDK),不支持,可以直接使用一段java代码打印。

PrintProviders.java

import java.security.Provider;
import java.security.Security;

public class PrintProviders {
    public static void main(String[] args) {
        for (Provider p : Security.getProviders()) {
            System.out.println("Provider: " + p.getName() + " | 版本: " + p.getVersion());
        }
    }
}

编译执行

$ jdks/bisheng-jdk1.8.0_402/bin/java PrintProviders
Provider: SUN | 版本: 1.8
Provider: SunRsaSign | 版本: 1.8
Provider: SunEC | 版本: 1.8
Provider: SunJSSE | 版本: 1.8
Provider: SunJCE | 版本: 1.8
Provider: SunJGSS | 版本: 1.8
Provider: SunSASL | 版本: 1.8
Provider: XMLDSig | 版本: 1.8
Provider: SunPCSC | 版本: 1.8

我在自己的测试环境,测试了没有sunJCE的报错,注:密码错提示不是这样的。

#cat J.java

import java.sql.*;
public class J {
  public static void main(String[] a) {
    try {
      Connection c = DriverManager.getConnection("jdbc:yasdb://172.20.xxx.xxx:1688/yasdb", "sys", "yashaxxxxxxx");
      System.out.println("LOGIN OK"); c.close();
    } catch (Throwable e) {
      System.out.println("EXCEPTION: " + e.getClass().getName());
      StackTraceElement[] st = e.getStackTrace();
      for (int i = 0; i < Math.min(8, st.length); i++) System.out.println("  at " + st[i]);
      Throwable cause = e.getCause();
      while (cause != null) {
        System.out.println("CAUSED BY: " + cause);
        StackTraceElement[] s2 = cause.getStackTrace();
        for (int i = 0; i < Math.min(8, s2.length); i++) System.out.println("  at " + s2[i]);
        cause = cause.getCause();
      }
    }
  }
}

原版openJDK配置文件中有sunJCE

$ ./jdk8u402-b06/bin/java -cp .:yashandb-jdbc-1.10.7.jar J
Sep 23, 2026 6:38:21 PM com.yashandb.log.JDKLoggerAdapter warn
WARNING: [line: 0 column: 0] YAS-02193 the account is locked
Sep 23, 2026 6:38:21 PM com.yashandb.log.JDKLoggerAdapter error
SEVERE: Connect Failed,then mark this hostSpec 172.20.xxxx:1688, Exception: [line: 0 column: 0] YAS-02193 the account is locked,spend time: 146
EXCEPTION: com.yashandb.jdbc.exception.YasException
  at com.yashandb.jdbc.exception.SQLError.createSQLException(Unknown Source)
  at com.yashandb.jdbc.exception.SQLError.createSQLException(Unknown Source)
  at com.yashandb.protocol.NativeProtocol.checkServerError(Unknown Source)
  at com.yashandb.protocol.NativeProtocol.receivePacket(Unknown Source)
  at com.yashandb.protocol.NativeProtocol.sendCommand(Unknown Source)
  at com.yashandb.protocol.NativeProtocol.doSecretLogin(Unknown Source)
  at com.yashandb.protocol.NativeProtocol.b(Unknown Source)
  at com.yashandb.protocol.NativeProtocol.a(Unknown Source)

原版openJDK配置文件中没有sunJCE

$ ./jdk8u402-nosun/bin/java -cp .:yashandb-jdbc-1.10.7.jar J

Sep 23, 2026 6:38:05 PM com.yashandb.log.JDKLoggerAdapter error
SEVERE: Decrypt AES failed.data:16,��$����*�t�,password: 16,9AC65B40839309A5,secretKey: 9AC65B40839309A5
java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/NoPadding
        at javax.crypto.Cipher.getInstance(Cipher.java:543)
        at com.yashandb.util.YasEncrypt.b(Unknown Source)
        at com.yashandb.util.YasEncrypt.decrypt(Unknown Source)
        at com.yashandb.protocol.NativeProtocol.doSecretLogin(Unknown Source)
        at com.yashandb.protocol.NativeProtocol.b(Unknown Source)
        at com.yashandb.protocol.NativeProtocol.a(Unknown Source)
        at com.yashandb.protocol.NativeProtocol.connect(Unknown Source)
        at com.yashandb.util.HostConnector.tryConnect(Unknown Source)
        at com.yashandb.util.StandAloneConnector.connect(Unknown Source)
        at com.yashandb.SessionImpl.connect(Unknown Source)
        at com.yashandb.jdbc.ConnectionImpl.<init>(Unknown Source)
        at com.yashandb.jdbc.ConnectionImpl.getInstance(Unknown Source)
        at com.yashandb.jdbc.YasDriver.connect(Unknown Source)
        at java.sql.DriverManager.getConnection(DriverManager.java:664)
        at java.sql.DriverManager.getConnection(DriverManager.java:247)
        at J.main(J.java:5)

原版Bisheng JDK 配置文件中有sunJCE

$ ./bisheng-jdk1.8.0_402/bin/java -cp .:yashandb-jdbc-1.10.7.jar J
Sep 23, 2026 6:40:59 PM com.yashandb.log.JDKLoggerAdapter warn
WARNING: [line: 0 column: 0] YAS-02193 the account is locked
Sep 23, 2026 6:40:59 PM com.yashandb.log.JDKLoggerAdapter error
SEVERE: Connect Failed,then mark this hostSpec 172.20.xxxxx:1688, Exception: [line: 0 column: 0] YAS-02193 the account is locked,spend time: 147
EXCEPTION: com.yashandb.jdbc.exception.YasException
  at com.yashandb.jdbc.exception.SQLError.createSQLException(Unknown Source)
  at com.yashandb.jdbc.exception.SQLError.createSQLException(Unknown Source)
  at com.yashandb.protocol.NativeProtocol.checkServerError(Unknown Source)
  at com.yashandb.protocol.NativeProtocol.receivePacket(Unknown Source)
  at com.yashandb.protocol.NativeProtocol.sendCommand(Unknown Source)
  at com.yashandb.protocol.NativeProtocol.doSecretLogin(Unknown Source)
  at com.yashandb.protocol.NativeProtocol.b(Unknown Source)
  at com.yashandb.protocol.NativeProtocol.a(Unknown Source)
JDKAES 握手说明
Temurin 8u402-b06✅ 正常标准 OpenJDK
毕昇 8u402(原厂)✅ 正常排除”毕昇出厂就带国密改造”的假设
删掉 SunJCE 的 JDK❌ 报客户同款错确认故障签名就是 provider 被删

如果一个主机上有多个JDK, 确认使用的是哪个jre. 如果还不行,建议更换bisheng JDK为原版 Temurin JDK。

Leave a Comment