Tomcat连接OCI ADB时TLS无Wallet报错问题求助
无需Wallet实现OCI ADB的TLS连接方案(Tomcat 9 + JDK8环境)
核心思路
通过提取OCI ADB的根证书并导入到JVM信任存储(或自定义信任存储),结合调整JDBC连接参数,替代Wallet完成TLS身份验证,实现无Wallet的安全连接。
步骤1:提取ADB根证书并导入信任存储
从现有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查看证书信息导入证书到信任存储
- 选项A:导入到JVM全局信任存储(
cacerts)
默认keytool -importcert -file adb-root.crt -alias adb-root -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeitcacerts密码为changeit,若已修改请替换为实际密码 - 选项B:创建并使用自定义信任存储(推荐,避免修改全局配置)
keytool -importcert -file adb-root.crt -alias adb-root -keystore ./adb-truststore.jks -storepass your-truststore-password
- 选项A:导入到JVM全局信任存储(
步骤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
相关产品推荐
相关产品推荐

