2015-09-03 3 views
1

У меня есть Java-код, который загружает хранилище ключей, которое определено внутри среды выполнения (.war-файл).Как читать значение JNDI из кода Java?

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. свойства:

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> 

ответ

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"); 
+0

Я устал второй вариант, но я получил исключение, что нет никакого «SSL. keystore.path "в" java: comp/env " –

+0

@ HussamEddin Пожалуйста, добавьте свой' web.xml', так как сложно угадать вашу конфигурацию. – Gas

+0

Добавлен web.xml. Как вы можете видеть, я не вижу значения «/was85/.../ecommerce_grs_mobile.p12 –

0

Единственный способ, которым я мог бы решить эту проблему является

  1. Добавление запись JNDI имени "ssl.keystore.path.AppName" Внутри WEBSPHERE JVM, которая имеет путь для моего хранилища ключей ,
  2. Добавление записи JNDI с именем "ssl.keystore.Pass.AppName" Внутри websphere JVM, который имеет значение для моего хранилища ключей Пароль.

Inside My 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()); 
+0

Это не имеет ничего общего с JNDI, его просто системным свойством JVM. – Gas

Смежные вопросы