【问题标题】:How to read JNDI value from Java code?如何从 Java 代码中读取 JNDI 值?
【发布时间】:2015-09-03 17:37:35
【问题描述】:

我有一个 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());

但是,我不需要对密钥库进行硬编码 - pass 。我需要从正在运行的 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值:

如何获取 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>

【问题讨论】:

    标签: java websphere jndi keystore


    【解决方案1】:

    我假设在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");
    

    【讨论】:

    • 我厌倦了第二个选项,但我得到了一个例外,即“java:comp/env”中没有“ssl.keystore.path”
    • @HussamEddin 请添加您的web.xml,因为很难猜出您的配置。
    • 添加了 web.xml。如您所见,我看不到值“/was85/.../ecommerce_grs_mobile.p12
    • @HussamEddin 您需要在&lt;env-entry-value&gt;中提供值
    • 这个值必须是空的,我不能硬编码它,因为它在环境之间是不同的。它应该从 JNDI 中读取。我需要从 Worklight 实例中读取它,而不是从硬编码中读取。
    【解决方案2】:

    我可以解决问题的唯一方法是通过

    1. 在内部添加名为"ssl.keystore.path.AppName"的JNDI条目 websphere JVM,其中包含我的密钥库的路径。
    2. 在内部添加名为"ssl.keystore.Pass.AppName"的JNDI条目 websphere JVM,它具有我的密钥库密码的值。

    在我使用的 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());
    

    【讨论】:

    • 这与 JNDI 无关,它只是 JVM 系统属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 2013-05-30
    • 1970-01-01
    • 2017-01-13
    相关资源
    最近更新 更多