我有很多测试可以毫无问题地访问我们的Oracle数据库,但是当我在使用密钥库的代码库中运行这些测试以及其他测试时,与数据库交互的测试不再能够连接。以下是他们获得的例外情况:
引起:java.sql.SQLException:ORA-01017:用户名/密码无效;登录被拒绝 at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:439) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:388) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:381) at 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) at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186) at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:366) 在oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:752) 在oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:359) 在oracle.jdbc.driver.PhysicalConnection。(PhysicalConnection.java:531) 在oracle.jdbc.driver.T4CConnection。(T4CConnection.java:221) at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:503) 在org.apache.commons.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。似乎驱动程序可能正在尝试与数据库建立SSL连接?我不确定。我似乎还记得当我们使用它时,SQL Server的一个非常类似的问题,当时我只是忽略了它。现在我们在一个单独的批处理和JVM中运行与密钥库交互的测试。
非常感谢任何帮助。
已更新
我做了一些调试,最后通过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连接开始失败。有什么想法吗?
最小测试用例
第一次连接尝试成功,但第二次尝试失败。
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初始化方法
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;
}
}
答案 0 :(得分:1)
缺少第二个连接字符串中的添加符号
答案 1 :(得分:0)
SEC_CASE_SENSITIVE_LOGON
设置为true
,则可以显示登录被拒绝错误。您可以通过SHOW PARAMETER SEC_CASE_SENSITIVE_LOGON
进行检查,然后通过ALTER SYSTEM SET SEC_CASE_SENSITIVE_LOGON = FALSE;
现在错误应该得到解决。
答案 2 :(得分:0)
1。 修改文件
%JAVA_HOME%/jre/lib/security/java.security
security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider
示例:
security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=com.sun.net.ssl.internal.ssl.Provider
security.provider.4=com.sun.crypto.provider.SunJCE
security.provider.5=sun.security.jgss.SunProvider
security.provider.6=com.sun.security.sasl.Provider
security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.8=sun.security.smartcardio.SunPCSC
security.provider.9=sun.security.mscapi.SunMSCAPI
security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider
或 2。
WSSConfig.setAddJceProviders(false);