我有一个启用了tcps的oracle数据库。我创建了java类来进行简单的查询。
首先,我创建证书并将其导入2台计算机。其中一个使用oracle java,另一个使用ibm java ....
所以问题是:我可以使用eracle与oracle java连接并运行查询。
但是当我尝试使用ibm java运行时,我遇到以下错误:
java.sql中。 SQLRecoverableException:IO错误:com.ibm.jsse2.util.h:PKIX 路径构建失败:java.security .cert.CertPathBuilderException: 无法找到所请求目标的有效证书路径 oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:752)at at oracle.jdbc。 driver.PhysicalConnection.connect(PhysicalConnection.java:662) 在 oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
我在两个cacerts文件中使用了完全相同的证书。
你有什么线索吗???
问候。
答案 0 :(得分:0)
我猜您使用keytool
来创建证书。如果是这样,请在一台机器上使用“ oracle java keytool”,在另一台机器上使用“ ibm java keytool”。
keytool -genkey -keyalg RSA -alias your_hostname -keystore your.keystore -storepass your_password -keypass your_password -validity 3650 -keysize 2048 -dname "CN=your_hostname"
keytool -exportcert -alias your_hostname -keystore your.keystore -storepass your_password -rfc -file oracle_or_ibm.crt
在Oracle数据库服务器/钱包中安装两个([oracle | ibm] .crt)生成的证书。如果使用SSL_CLIENT_AUTHENTICATION=FALSE
配置数据库服务器,也可能会有所帮助。然后在两个客户端计算机上导入数据库证书。
keytool -importcert -keystore your.keystore -storepass your_password -noprompt -file database-certificate.crt -alias database_alias
要检查密钥库,请执行以下操作:keytool -list -keystore your.keystore -storepass your_password
您的Java代码可能看起来像这样:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class OracleJdbcTest {
public static void main(String[] args) {
try (Connection connection = DriverManager.getConnection(
"jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=hostname)(PORT=2484))(CONNECT_DATA=(SERVICE_NAME=servicename)))",
"username", "password")) {
System.out.println("Java JDBC Oracle Example");
System.out.println("Connected to Oracle database!");
Statement statement = connection.createStatement();
} catch (SQLException e) {
System.out.println("Connection failure.");
e.printStackTrace();
}
}
}
像这样运行它:
java -cp ojdbc7.jar:. -Djavax.net.ssl.trustStore=your.keystore -Djavax.net.ssl.trustStorePassword=your_password -Djavax.net.ssl.keyStore=your.keystore -Djavax.net.ssl.keyStorePassword=your_password -Djavax.net.ssl.keyStoreType=JKS -Djavax.net.ssl.trustStoreType=JKS -Doracle.net.ssl_version=1.2 OracleJdbcTest
要调试,请添加属性:-Djavax.net.debug=all
还可能需要使用TLS版本(例如-Doracle.net.ssl_version=1.1
)