JDBC预言机钱包连接

Posted

技术标签:

【中文标题】JDBC预言机钱包连接【英文标题】:JDBC oracle wallet connection 【发布时间】:2017-03-02 16:24:11 【问题描述】:

我在使用 oracle 钱包作为密码存储将我的 java 应用程序连接到 oracle 数据库时遇到问题。

为了隔离问题,我做了一个小的 Main 类如下:

public static void main(String[] args) 
Connection conn;
try 
Class.forName("oracle.jdbc.driver.OracleDriver");
System.setProperty("oracle.net.tns_admin", "c:\\tns");
OracleDataSource ds = new OracleDataSource();
Properties props = new Properties();
System.setProperty("oracle.net.wallet_location", "c:/wallet2");

ds.setConnectionProperties(props);
ds.setURL("jdbc:oracle:thin:/@XE2");
Provider p;
p = new OraclePKIProvider();
Security.insertProviderAt(p, 3);
conn = ds.getConnection();

 catch (SQLException ex) 
Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);

 catch (ClassNotFoundException ex) 
Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);

在目录 c:\tns 我有以下文件:

sqlnet.ora
tnsnames.ora

这是 sqlnet.ora 的列表

SQLNET.AUTHENTICATION_SERVICES = (NTS)
names.directory_path = TNSNAMES
SQLNET.WALLET_OVERRIDE = TRUE
#WALLET_LOCATION = (SOURCE=(METHOD=FILE)METHOD_DATA=(DIRECTORY=c:\wallet))
WALLET_LOCATION = (SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=c:/wallet)))

用于 tnsnames

...
XE2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )

在c:\wallet2中有以下文件:

cwallet.sso
ewallet.p12

该文件之前是使用 orapki 生成的,并且我的条目名为 XE2 并具有正确的凭据。当我运行代码时,我得到以下异常

Could not open wallet. java.io.IOException: Could not open wallet. Check password

启用 oracle 跟踪我可以看到这些行:

mar 02, 2017 3:57:00 PM oracle.jdbc.driver.DatabaseError findMessage
TRACE_30:          Enter: "ORA-17168", java.io.IOException: Could not open wallet. java.io.IOException: Could not open wallet. Check password
mar 02, 2017 3:57:00 PM oracle.jdbc.driver.Message11 msg
TRACE_30: 72B6CBCC Enter: "ORA-17168", java.io.IOException: Could not open wallet. java.io.IOException: Could not open wallet. Check password
mar 02, 2017 3:57:00 PM oracle.jdbc.driver.Message11 msg
TRACE_30: 72B6CBCC Exit [0.066509ms]

mar 02, 2017 3:57:00 PM oracle.jdbc.driver.PhysicalConnection getSecretStoreCredentials
GRAVE:          Throwing SQLException: 168java.io.IOException: Could not open wallet. java.io.IOException: Could not open wallet. Check password

有人可以帮助我吗? 谢谢阅读。 r.

【问题讨论】:

看起来像钱包位置问题,因为 ORA-17168 表示 Secret Store 遇到问题。检查钱包位置是否存在打开的钱包 (cwallet.sso),并使用 mkstore 实用程序确保此钱包包含正确的凭据。检查您是否指向正确的位置。 路径正确,cwallet.sso 在里面。此外,我使用 mkstore 实用程序测试了密钥库的内容,并且存在 XE 条目 【参考方案1】:

这是一个非常古老的话题。 -TNS_ADMIN 应该指向钱包位置( C:\wallet2 ) -in tnsnames.ora wallet_location 是 C:\wallet2 而不是 c:/walet

【讨论】:

【参考方案2】:

我认为您的ewallet.p12 文件受密码保护。

您需要使用密码设置oracle.net.wallet_password 属性:

System.setProperty("oracle.net.wallet_password", "PASSWORD");

如果指定密码,则the driver looks为p12文件,否则使用sso文件。

【讨论】:

【参考方案3】:

SQLNET.AUTHENTICATION_SERVICES = (NTS)

那应该是 TNS 而不是 NTS。

【讨论】:

以上是关于JDBC预言机钱包连接的主要内容,如果未能解决你的问题,请参考以下文章

预言机,XFS连接区块链与外界的桥梁

去中心化预言机网络ADAMoracle提供预言机整体解决方案

ADAMoracle预言机广域节点网络参与教程详解v1.0

区块链预言机预言机原理

ADAMoracle预言机创始人及ADAM通证分配机制

构建Web3.0分布式多节点计算机预言机网络