我有一个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值:
如何获取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>
答案 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)
我能解决问题的唯一方法是
"ssl.keystore.path.AppName"
的JNDI条目
websphere JVM,它有我的密钥库的路径。"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());