我有很多测试可以毫无问题地访问我们的Oracle数据库,但是当我在使用密钥库的代码库中运行这些测试以及其他测试时,与数据库交互的测试不再能够连接 . 以下是他们获得的例外情况:
引起:java.sql.SQLException:ORA-01017:用户名/密码无效;登录在oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:439)的oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:439)处于oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java) :381)oracle.jdbc.driver.T4CTTIfun.processError(T4CTTIfun.java:564)at oracle.jdbc.driver.T4CTTIoauthenticate.processError(T4CTTIoauthenticate.java:431)at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun . java:436)oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:366)at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate .java:752)oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:359)at oracle.jdbc.driver.PhysicalConnection . (PhysicalConnection.java:531)at oracle.jdbc.driver.T4CConnection . (T4CConnection . java:221)oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)at org.apache.com上的oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:503) mons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:37)位于org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:290)org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java: 877)在org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:851)... 68更多
显然用户名和密码仍然正确 . 我很难搞清楚我们的代码中导致连接失败的原因,而且我真的不知道如何调试Oracle驱动程序尝试连接时发生的情况 . 我在Oracle 11g中使用Oracle瘦驱动程序 . 我们使用Spring,Hibernate和Apache Commons DBCP . 似乎驱动程序可能正在尝试与数据库 Build SSL连接?我不确定 . 我似乎还记得当我们使用它时,SQL Server的一个非常类似的问题,当时我只是忽略了它 . 现在,我们在单独的批处理和JVM中运行与密钥库交互的测试 .
任何帮助将不胜感激 .
UPDATED
我做了一些调试,最后通过Spring-WS跟踪我们对wss4j库(版本1.5.9)的使用 . 最终,WSSConfig类获取了一组执行此操作的代码:
int ret = 0;
for (int i = 0; i < provs.length; i++) {
if ("SUN".equals(provs[i].getName())
|| "IBMJCE".equals(provs[i].getName())) {
ret =
java.security.Security.insertProviderAt(
(java.security.Provider) c.newInstance(), i + 2
);
break;
}
}
在此代码之后,我与Oracle的连接立即停止工作 . 看起来当使用充气城堡提供程序调用insertProviderAt方法时,我的Oracle连接开始失败 . 有任何想法吗?
Minimal Test Case
第一次连接尝试成功,但第二次尝试失败 .
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@server/servicename", "username", "password");
conn.prepareStatement("select * from dual").getResultSet();
conn.close();
org.apache.ws.security.WSSConfig.getDefaultWSConfig();
conn = DriverManager.getConnection("jdbc:oracle:thin:server/servicename", "username", "password");
conn.prepareStatement("select * from dual").getResultSet();
conn.close();
WSSConfig Initialize Method
private synchronized void
staticInit() {
if (!staticallyInitialized) {
org.apache.xml.security.Init.init();
if (addJceProviders) {
/*
* The last provider added has precedence, that is if JuiCE can be added
* then WSS4J uses this provider.
*/
addJceProvider("BC", "org.bouncycastle.jce.provider.BouncyCastleProvider");
addJceProvider("JuiCE", "org.apache.security.juice.provider.JuiCEProviderOpenSSL");
}
Transform.init();
try {
Transform.register(
STRTransform.implementedTransformURI,
"org.apache.ws.security.transform.STRTransform"
);
} catch (Exception ex) {
if (log.isDebugEnabled()) {
log.debug(ex.getMessage(), ex);
}
}
staticallyInitialized = true;
}
}
3 回答
缺少第二个连接字符串中的添加符号
如果在oracle中参数
SEC_CASE_SENSITIVE_LOGON
设置为true
,则可以显示登录被拒绝错误 . 您可以通过SHOW PARAMETER SEC_CASE_SENSITIVE_LOGON
进行检查并通过ALTER SYSTEM SET SEC_CASE_SENSITIVE_LOGON = FALSE;
进行更改现在错误应该得到解决 .
1.修改文件
例:
或2 .