如何从Java代码中读取JNDI值?

时间:2015-09-03 17:37:35

标签: java websphere jndi keystore

我有一个Java代码,用于加载在运行时(.war文件)中定义的密钥库。

 KeyStore trustStore = KeyStore.getInstance("PKCS12");
 File key = new File ("/was85/resources/security/ecommerce_gr_mobile.p12");
 trustStore.load(new FileInputStream(key), "Pass".toCharArray());

但是,我不需要对密钥存储区进行硬编码 - 传递。我需要从正在运行的EAR中获取它们,因为这些值在我们的环境中是不同的(DEV-QA-UAT和PROD)。

我读到我需要使用这样的东西:

Properties properties = new java.util.Properties();  
InputStream inputStream =     
getServletContext().getResourceAsStream("/WEB-INF/web.xml/worklight.properties");  
properties.load(inputStream); 
String keystore= properties.getProperty("ssl.keystore.path");

但是,worklight.properties中的值是默认值,而不是我们在运行时中定义的值

worklight.properties:

ssl.keystore.path = /conf/default.keystore

运行时内的JDNI值:

enter image description here

如何获取JNDI中定义的而不是默认值?

编辑:

Web.xml中:

<env-entry>
        <description>[OPTIONAL] SSL certificate keystore location. Default: conf/default.keystore.</description>
        <env-entry-name>ssl.keystore.path</env-entry-name>
        <env-entry-type>java.lang.String</env-entry-type>
        <env-entry-value/>
    </env-entry>

    <env-entry>
        <description>[OPTIONAL] SSL certificate keystore type. Valid keystore types: jks, PKCS12. Default: jks.</description>
        <env-entry-name>ssl.keystore.type</env-entry-name>
        <env-entry-type>java.lang.String</env-entry-type>
        <env-entry-value/>
    </env-entry>

    <env-entry>
        <description>[OPTIONAL] SSL certificate keystore password.Default: worklight.</description>
        <env-entry-name>ssl.keystore.password</env-entry-name>
        <env-entry-type>java.lang.String</env-entry-type>
        <env-entry-value/>
    </env-entry>

2 个答案:

答案 0 :(得分:0)

我认为在web.xml中你有env-entry这样的(可能会将你的web.xml添加到问题中):

<env-entry>
    <env-entry-name>ssl.keystore.path</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>/conf/default.keystore</env-entry-value>
</env-entry>

在这种情况下,您应该通过注释访问它,如下所示:

@Resource(name="ssl.keystore.path", type=String.class)
private String filePath;

或通过InitialContext

InitialContext ctx = new InitialContext();
String filePath = (String) ctx.lookup("java:comp/env/ssl.keystore.path");

答案 1 :(得分:0)

我能解决问题的唯一方法是

  1. 在...中添加名为"ssl.keystore.path.AppName"的JNDI条目 websphere JVM,它有我的密钥库的路径。
  2. 在...中添加名为"ssl.keystore.Pass.AppName"的JNDI条目 websphere JVM,其值为我的密钥库密码。
  3. 在我使用的Java代码中:

    KeyStore trustStore = KeyStore.getInstance("PKCS12");
    String keystorePath = System.getProperty("ssl.keystore.path.AppName");
    String keystorePass = System.getProperty("ssl.keystore.Pass.AppName");
    

    ,主要代码变为:

    File key = new File (keystorePath);
    trustStore.load(new FileInputStream(key), keystorePass.toCharArray());