6

我想使用存储在内存中的钱包而不是将钱包存储在磁盘上来连接到 Oracle 数据库。

我尝试使用 Apache Common VFS 读取/写入内存中的文件。钱包被写入内存(以确保我什至将钱包文件夹从内存写入我的磁盘)。

properties.put("oracle.net.tns_admin", "ram://my_wallet");
properties.put("oracle.net.wallet_location",
          String.format("(SOURCE=(METHOD=file)(METHOD_DATA=(DIRECTORY=%s)))", "ram://my_wallet"));

当我尝试使用这些属性建立连接时,出现错误:

java.sql.SQLRecoverableException: IO Error: could not resolve the connect identifier DB_1222

PS:如果我将钱包放在磁盘上,我的代码可以正常工作。

4

4 回答 4

2

一种解决方法可能是利用操作系统的内存文件系统支持,因此它看起来像 JDBC 的普通文件,但操作系统实际上将它存储在内存中。在类 Unix 系统上,tmpfs 就是这样一个文件系统:https ://en.m.wikipedia.org/wiki/Tmpfs

于 2019-11-27T15:08:43.230 回答
1

我知道这是一个老问题,但您现在可以将 SSLContext 设置为 OracleDatasource 并让上下文从任何输入流中读取钱包:

        TrustManagerFactory trustManagerFactory =
                TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        KeyManagerFactory keyManagerFactory =
                KeyManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());

        KeyStore keyStore = KeyStore.getInstance("SSO", new OraclePKIProvider());


        // ** Read wallet in-memory here **
        keyStore.load(new ByteArrayInputStream(your_wallet_in_memory), null);


        keyManagerFactory.init(keyStore, null);
        trustManagerFactory.init(keyStore);

        SSLContext sslContext = SSLContext.getInstance("SSL");
        sslContext.init(
                keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);

        Properties info = new Properties();

        info.put(OracleConnection.CONNECTION_PROPERTY_USER_NAME, userName);
        info.put(OracleConnection.CONNECTION_PROPERTY_PASSWORD, userPassword);

        OracleDataSource ods = new OracleDataSource();
        ods.setURL(dbUrl);
        ods.setConnectionProperties(info);
        ods.setSSLContext(sslContext);

我已经使用该方法发布了一个示例服务,并在此 repo 中使用不同类型的钱包进行了测试: https ://github.com/nomisvai/oracle-in-memory-wallet-samples

于 2021-04-09T20:29:54.430 回答
0

不幸的是,Oracle JDBC 目前不支持从内存中获取钱包。

于 2019-11-27T11:12:04.833 回答
0

我已经写了一篇关于这个主题的博客...... https://dzone.com/articles/how-to-use-vaults-and-wallets-for-simple-secure-connectivity

许多框架现在具有将钱包文件夹放入内存的便利功能,特别是对于 OCI 自治数据库案例,您可以在其中动态下载钱包,允许轮换等,从可管理性和安全性的角度来看,这是很好的。

例如在赫利顿...

oracle:
  ucp:
    jdbc:
      PoolDataSource:
        atp:
          connectionFactoryClassName: oracle.jdbc.pool.OracleDataSource
          userName: "ADMIN"
          password: "HelidonATP123"
          serviceName: "helidonatp"
oci:
  atp:
    ocid: "ocid1.autonomousdatabase.oc1.iad.anuwasdfasfdasdfasdfadfcebvb5ehmxlu22xpfwq"
    walletPassword: HelidonTest1

在 Micronaut 中...

micronaut:
  config-client:
    enabled: true
oci:
  config:
    profile: DEFAULT 
  vault:
    config:
      enabled: true
    vaults:
      - ocid: ocid1.vault..aaaaaaaatafcasdfadf3xq24hbqvq
        compartment-ocid: ocid1.compartment.oc1..aaaaaaaatafcasdasdfasdfrzwzjxgn3xq24hbqvq
于 2021-12-19T15:49:34.240 回答