簡體   English   中英

帶有SSL的Java JDBC:不支持電子錢包版本,或者trustAnchors參數必須為非空

[英]Java JDBC with SSL: Wallet version not supported or the trustAnchors parameter must be non-empty

我已將Oracle 11g數據庫服務器配置為使用錢包和自簽名證書與SSL一起使用。 錢包已啟用自動登錄。 我使用另一台計算機上的客戶端(sqlplus)測試了連接,並且該連接有效。

現在,我嘗試使用Java JDBC連接到數據庫。

我有兩個代碼版本,兩者都不起作用。 第一個嘗試使用SSO選項:

    Connection connection = null;

    String url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=192.168.200.191)(PORT=1522))(CONNECT_DATA=(SERVICE_NAME=DBSERVICE)))";

    Properties props = new Properties();
    props.setProperty("user", "dbuser");
    props.setProperty("password", "dbpass");

    //Single sign on
    props.setProperty("javax.net.ssl.trustStore", "C:\\oracle\\wallet\\cwallet.sso");
    props.setProperty("javax.net.ssl.trustStoreType","SSO");

    /* Load the database driver */
    try
    {
        Security.addProvider(new oracle.security.pki.OraclePKIProvider());
        DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
        connection = DriverManager.getConnection(url,props);
        if (connection != null) {
            System.out.println("You made it, take control your database now!");
        } else {
            System.out.println("Failed to make connection!");
        }
    }
    catch (SQLException ex) {
    ex.printStackTrace();
}

在這個版本中,我得到

java.io.IOException: Wallet version not supported
        at oracle.security.pki.OracleSSOKeyStoreSpi.engineLoad(OracleSSOKeyStoreSpi)

第二個是使用錢包本身:

    Connection connection = null;

    String url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=192.168.200.191)(PORT=1522))(CONNECT_DATA=(SERVICE_NAME=DBSERVICE)))";

    Properties props = new Properties();
    props.setProperty("user", "dbuser");
    props.setProperty("password", "dbpass");

    //with password
    props.setProperty("javax.net.ssl.trustStore", "C:\\oracle\\wallet\\ewallet.p12");
    props.setProperty("javax.net.ssl.trustStorePassword","WalletPasswd1234");
    props.setProperty("javax.net.ssl.trustStoreType","PKCS12");
    props.setProperty("oracle.net.ssl_cipher_suites","(SSL_RSA_WITH_3DES_EDE_CBC_SHA)");

    /* Load the database driver */
    try
    {
        Security.addProvider(new oracle.security.pki.OraclePKIProvider());
        DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
        connection = DriverManager.getConnection(url,props);
        if (connection != null) {
            System.out.println("You made it, take control your database now!");
        } else {
            System.out.println("Failed to make connection!");
        }
    }
    catch (SQLException ex) {
    ex.printStackTrace();
}

通過這種嘗試,我得到

java.io.IOException: Wallet version not supported
        at oracle.security.pki.OracleSSOKeyStoreSpi.engineLoad(OracleSSOKeyStoreSpi)
        at java.security.KeyStore.load(Unknown Source)
        at oracle.net.nt.CustomSSLSocketFactory.getTrustManagerArray(CustomSSLSocketFactory.java:406)

我已經將以下JAR添加到了項目中(不確定我是否全部都需要它們):

  1. ojdbc6.jar
  2. oraclepki.jar
  3. osdt_cert.jar
  4. osdt_core.jar
  5. ojpse.jar
  6. osdt_xmlsec.jar
  7. osdt_wss.jar
  8. osdt_saml.jar
  9. ldapjclnt10.jar
  10. jssl-1_1.jar
  11. jaxen.jar
  12. javax-ssl-1_1.jar

請告知我如何解決此問題,謝謝。

確保使用12.1.0.2以來的最新版本的oraclepki.jar和ojdbc6.jar。 如果問題仍然存在,則可以嘗試使用orapki wallet pkcs12_to_jks將錢包轉換成jks文件。 完整的命令行如下所示(將<>之間的值替換為您自己的值):

orapki wallet pkcs12_to_jks -wallet <wallet_directory> -pwd <wallet_password> -jksKeyStoreLoc <keystore.jks> -jksKeyStorepwd <keystore_jks_password> -jksTrustStoreLoc <truststore.jks> -jksTrustStorepwd <truststore_jks_password>

將jks文件用於密鑰庫和信任庫將比錢包更容易。 您只需要配置javax.net.ssl.trustStore和javax.net.ssl.keyStore屬性。 您甚至不需要額外的jar,例如oraclepki.jar或osdt jar。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM