Java连接PKI认证TCPS JDBC地址报密钥库密码错误问题
Oracle JDBC TCPS连接报keystore密码错误问题
问题场景
对接使用TCPS协议的JDBC URL,已完成wallet配置,在keystore中导入了所需证书(已生成密钥对并完成公钥交换)。通过Java客户端发起JDBC连接时,抛出如下异常:
Caused by: java.io.IOException: keystore password was incorrect at java.base/sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:2159) at java.base/sun.security.util.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:221) at java.base/java.security.KeyStore.load(KeyStore.java:1473)
现有实现与配置
连接实现代码
Class.forName("oracle.jdbc.driver.OracleDriver"); OracleDataSource ds = new OracleDataSource(); ds.setURL("jdbc:oracle:thin:/@pkidb_ssl"); // ds.setURL("jdbc:oracle:thin:/@SAMPLEDB_RO"); Provider p; p = new OraclePKIProvider(); Security.insertProviderAt(p, 3); conn = ds.getConnection(); PreparedStatement ps = conn.prepareStatement("SELECT * FROM V$VERSION"); ResultSet rs = ps.executeQuery(); rs.next(); String val = rs.getString(1); System.out.println("Output: " + val); rs.close(); ps.close(); System.out.println("Finished");
已配置JVM启动参数
-Djavax.net.ssl.keyStore="<path-to-jdk>/lib/security/cacerts" -Djavax.net.ssl.keyStorePassword="changeit" -Djavax.net.ssl.trustStore="<path-to-jdk>/lib/security/cacerts" -Djavax.net.ssl.trustStorePassword="changeit"
可通过命令行正常访问上述配置的keystore查看内容,命令行验证时所用密钥库密码完全正确。
排查进展
初步排查方向为两种可能:一是JDBC引用了其他内置JVM实例的密钥库,二是Oracle JDBC存在独立的密码指定配置项。
经断点调试确认异常行为:额外配置-Doracle.net.wallet_password、-Doracle.net.wallet_location两个JVM参数后,连接逻辑实际优先读取oracle.net.wallet_location指定的wallet文件作为密钥库,而非javax.net.ssl.keyStore、javax.net.ssl.trustStore指定的路径;密码读取逻辑同理,未使用配置的keyStorePassword、trustStorePassword参数。
待解决问题
- 如何修复当前连接抛出的keystore密码错误异常
- 如何正确配置Oracle JDBC PKI连接所使用的密钥库及对应密码
- 如何确认当前连接实际加载的keystore、trustStore路径,以及程序内部尝试使用的密钥库密码
内容的提问来源于stack exchange,提问作者Amit Mahajan
相关产品推荐
相关产品推荐

