You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tomcat连接OCI ADB时TLS无Wallet报错问题求助

无需Wallet实现OCI ADB的TLS连接方案(Tomcat 9 + JDK8环境)

核心思路

通过提取OCI ADB的根证书并导入到JVM信任存储(或自定义信任存储),结合调整JDBC连接参数,替代Wallet完成TLS身份验证,实现无Wallet的安全连接。

步骤1:提取ADB根证书并导入信任存储

  1. 从现有Wallet导出根证书
    使用Oracle的orapki工具从已有的ADB Wallet中导出根证书(若没有现有Wallet,可从OCI控制台下载Wallet后操作):

    orapki wallet export -wallet /path/to/your/existing/wallet -dn "CN=Oracle Root CA" -cert adb-root.crt
    

    注:若不清楚证书的DN,可先执行orapki wallet display -wallet /path/to/wallet查看证书信息

  2. 导入证书到信任存储

    • 选项A:导入到JVM全局信任存储(cacerts)
      keytool -importcert -file adb-root.crt -alias adb-root -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit
      
      默认cacerts密码为changeit,若已修改请替换为实际密码
    • 选项B:创建并使用自定义信任存储(推荐,避免修改全局配置)
      keytool -importcert -file adb-root.crt -alias adb-root -keystore ./adb-truststore.jks -storepass your-truststore-password
      

步骤2:调整JDBC连接配置

移除原有的oracle.net.wallet_location和oracle.net.tns_admin JVM参数,修改数据源配置代码如下:

PoolDataSource ds = PoolDataSourceFactory.getPoolDataSource();
try {
    ds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
    // 调整连接字符串,明确指定TLS版本,保持ssl_server_dn_match=no(若需验证服务器DN可改为yes)
    ds.setURL(
        "jdbc:oracle:thin:@(description= (address=(protocol=tcps)(port=1521)(host=ip.address.of.adb))(connect_data=(service_name=$service_name))(security=(ssl_server_dn_match=no)(ssl_version=TLSv1.2)))");
    ds.setUser("myUser");
    ds.setPassword("********");
    ds.setInitialPoolSize(5);
    ds.setMinPoolSize(5);
    ds.setMaxPoolSize(10);

    // 若使用自定义信任存储,添加以下连接属性(使用全局cacerts则可省略)
    ds.setConnectionProperty("javax.net.ssl.trustStore", "/path/to/adb-truststore.jks");
    ds.setConnectionProperty("javax.net.ssl.trustStorePassword", "your-truststore-password");
} catch (Exception ignore) {
    throw new IllegalArgumentException("Error occurred while trying to configure datasource");
}

步骤3:验证连接

启动Tomcat应用,确保没有配置任何Wallet相关的JVM参数,测试数据库连接是否正常建立。

错误原因说明

未配置Wallet时,Oracle JDBC默认尝试通过Wallet路径加载信任存储,找不到有效Wallet时会抛出Unable to initialize the trust store相关错误。改用标准JVM SSL信任存储配置后,JDBC会直接从指定的信任存储中读取ADB根证书,完成TLS握手验证。

内容的提问来源于stack exchange,提问作者Sujoy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 02:37:50