3

我有许多测试可以毫无问题地访问我们的 Oracle 数据库,但是当我在我们的代码库中运行这些测试以及使用密钥库的其他测试时,与数据库交互的测试不再能够连接。这是他们得到的例外:

引起:java.sql.SQLException:ORA-01017:用户名/密码无效;在 oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java) 的 oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:388) 的 oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:439) 处的登录被拒绝:381) 在 oracle.jdbc.driver.T4CTTIoauthenticate.processError(T4CTTIoauthenticate.java:431) 在 oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.receive) 的 oracle.jdbc.driver.T4CTTIfun.processError(T4CTTIfun.java:564)。 java:436) 在 oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186) 在 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。

显然用户名和密码仍然是正确的。我很难弄清楚我们的代码中导致连接失败的原因,而且我真的不知道如何调试 Oracle 驱动程序尝试连接时发生的情况。我将 Oracle 瘦驱动程序与 Oracle 11g 一起使用。我们使用 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;
        }
    }
4

3 回答 3

1

第二个连接字符串中的添加符号丢失

于 2013-05-27T01:57:52.003 回答
0

SEC_CASE_SENSITIVE_LOGON如果在 oracle中设置了参数,则会显示登录被拒绝错误true。您可以通过检查SHOW PARAMETER SEC_CASE_SENSITIVE_LOGON并更改它ALTER SYSTEM SET SEC_CASE_SENSITIVE_LOGON = FALSE;

现在错误应该得到解决。

于 2013-03-01T10:02:10.393 回答
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);
于 2014-03-19T01:51:18.193 回答