【问题标题】:Setting file content instead of path for truststore设置文件内容而不是信任库的路径
【发布时间】:2018-11-28 12:50:07
【问题描述】:

我正在通过我的 java 代码连接到 oracle ssl 侦听器。 Java 代码在 AWS Lambda 中运行。为了通过 SSL 端口连接到 oracle,我需要通过 cwallet.sso 证书。此证书采用 base64 编码并存储在保险库中。我能够从保险库中以字符串形式获取证书的内容。我需要base64解码并使用内容连接到oracle。下面是我在本地机器上使用的代码来连接到oracle ssl端口。由于我从 vault 获取数据作为流,有没有一种方法可以提供证书(cwallet.sso)而无需创建文件?

DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());                                                                                           
      Security.addProvider(new oracle.security.pki.OraclePKIProvider());                                                                                             
      String url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=<hostname>)(PORT=1522))(CONNECT_DATA=(SID=<SID>)))";      
      java.util.Properties info = new java.util.Properties();                                                                                                        
      ClassLoader classLoader = getClass().getClassLoader();                                                                                                         
      info.setProperty("javax.net.ssl.trustStore", Paths.get(classLoader.getResource("certs/cwallet.sso").toURI()).toString());                                      
      info.setProperty("javax.net.ssl.trustStoreType", "SSO");                                                                                                       
      info.setProperty("user", "username");                                                                                                                        
      info.setProperty("password", "password");                                                                                                                       

      Connection conn = DriverManager.getConnection(url, info);                                                                                                      
      Statement stmt = conn.createStatement();                                                                                                                       
      ResultSet rset = stmt.executeQuery("select * from table where rownum < 10");

【问题讨论】:

  • 你能提供更多细节吗?
  • @SazzadurRahaman 添加了更多细节。

标签: java oracle java-8 java-io truststore


【解决方案1】:

通常可以从内存中加载证书,例如here 所述,但是在当前上下文中,我们受到 Oracle 驱动程序支持的限制。

驱动程序的配置在here 中进行了描述,除了支持基于文件的信任存储之外,它看起来并不像任何东西。由于 Oracle 驱动程序是闭源的,因此很难提供更明确的答案。

【讨论】:

  • 谢谢@hgrey。我最终在文件系统中创建了一个临时文件并引用了该文件。