JDBC 基于 Oracle 钱包的连接:内存中的钱包文件夹
JDBC Oracle wallet based connection: Wallet folder in memory
我想使用存储在内存中的钱包连接到 Oracle 数据库,而不是将钱包存储在磁盘上。
我尝试使用 Apache Common VFS 来 read/write 内存中的文件。钱包被写入内存(为了确保我什至将钱包文件夹从 ram 写入我的磁盘)。
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:如果我把钱包放在磁盘上,我的代码就可以正常工作。
很遗憾,Oracle JDBC 目前不支持从内存中获取钱包。
一种解决方法可能是利用 OS 的内存文件系统支持,因此它看起来像 JDBC 的普通文件,但实际上 OS 正在存储它在记忆中。在类 Unix 系统上,tmpfs 就是这样一个文件系统:https://en.m.wikipedia.org/wiki/Tmpfs
我知道这是一个老问题,但您现在可以将 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);
我已经发布了一个使用该方法的示例服务,并在此回购协议中使用不同类型的钱包进行了测试:
https://github.com/nomisvai/oracle-in-memory-wallet-samples
我已经写了一篇关于这个主题的博客...https://dzone.com/articles/how-to-use-vaults-and-wallets-for-simple-secure-connectivity
许多框架现在具有将钱包文件夹放入内存的便利功能,特别是对于 OCI 自治数据库的情况,您可以在其中动态下载钱包,允许轮换等,从可管理性和安全性的角度来看,这些都是很好的.
例如在 Helidon...
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
我想使用存储在内存中的钱包连接到 Oracle 数据库,而不是将钱包存储在磁盘上。
我尝试使用 Apache Common VFS 来 read/write 内存中的文件。钱包被写入内存(为了确保我什至将钱包文件夹从 ram 写入我的磁盘)。
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:如果我把钱包放在磁盘上,我的代码就可以正常工作。
很遗憾,Oracle JDBC 目前不支持从内存中获取钱包。
一种解决方法可能是利用 OS 的内存文件系统支持,因此它看起来像 JDBC 的普通文件,但实际上 OS 正在存储它在记忆中。在类 Unix 系统上,tmpfs 就是这样一个文件系统:https://en.m.wikipedia.org/wiki/Tmpfs
我知道这是一个老问题,但您现在可以将 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);
我已经发布了一个使用该方法的示例服务,并在此回购协议中使用不同类型的钱包进行了测试: https://github.com/nomisvai/oracle-in-memory-wallet-samples
我已经写了一篇关于这个主题的博客...https://dzone.com/articles/how-to-use-vaults-and-wallets-for-simple-secure-connectivity
许多框架现在具有将钱包文件夹放入内存的便利功能,特别是对于 OCI 自治数据库的情况,您可以在其中动态下载钱包,允许轮换等,从可管理性和安全性的角度来看,这些都是很好的.
例如在 Helidon...
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