在GlassFish中通过SSL远程访问Message Queue

时间:2016-04-21 10:29:00

标签: java ssl jms keystore glassfish-4.1

我试图访问在GlassFish中配置的消息队列但是遇到了很多问题。第一个是关于客户端的Trust Store密码。我只能使用默认密码(changeit)才能使它工作,我总是得到

Keystore was tampered with, or password was incorrect

如果我尝试使用其他密码。是的,我很确定我使用的是正确的密码。 实际上,如果我使用默认密码设置Trust Store并使用具有错误值的以下属性,它仍然有效:

-Djavax.net.ssl.trustStorePassword=<wrong value>

这使我得出结论,它完全忽略了这个设置。 这就是我到目前为止:

System.setProperty("com.sun.CSIV2.ssl.standalone.client.required", "true");
System.setProperty("javax.net.ssl.trustStore", "<my path>/truststore.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "<my password>");

Properties properties = new Properties();

System.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
System.setProperty("org.omg.CORBA.ORBInitialPort", "3820");

InitialContext ctx = new InitialContext(properties);

com.sun.messaging.ConnectionFactory connectionFactory = new com.sun.messaging.ConnectionFactory();

connectionFactory.setProperty(ConnectionConfiguration.imqAddressList, "127.0.0.1:7676");
connectionFactory.setProperty(ConnectionConfiguration.imqDefaultUsername, "<app user>");
connectionFactory.setProperty(ConnectionConfiguration.imqDefaultPassword, "<app user password>");

QueueConnection queueConnection = connectionFactory.createQueueConnection();

queueConnection.start();

所以,我的第一个问题是:如何在我的Trust Store上使用非默认密码?我是否必须对值使用某种编码/散列?

我的第二个问题是关于身份验证。获取连接工厂(通过JNDI)和验证(通过createQueueConnection(用户,传递))的标准方法似乎不起作用,它总是尝试使用来宾帐户。有没有办法在GlassFish上使用标准方法,还是仅限于使用专有代码?

编辑#1

在深入挖掘之后,我发现了一个看似错误的行为。 查看堆栈跟踪,调用的第一个方法之一是来自com.sun.enterprise.security.ssl.impl.SecuritySupportImpl的initJKS()。在javassist的帮助下,我意识到正在调用以下部分:

if (masterPasswordHelper == null && Globals.getDefaultHabitat() != null) {
       masterPasswordHelper = Globals.getDefaultHabitat().getByType(MasterPasswordImpl.class);
}
if (masterPasswordHelper instanceof MasterPasswordImpl) {
       keyStorePass = masterPasswordHelper.getMasterPassword();
       trustStorePass = keyStorePass;
}

绕过下一组指令:

if (keyStorePass == null) {
    keyStorePass = System.getProperty(KEYSTORE_PASS_PROP, DEFAULT_KEYSTORE_PASS).toCharArray();
    trustStorePass = System.getProperty(TRUSTSTORE_PASS_PROP, DEFAULT_TRUSTSTORE_PASS).toCharArray();}

因此,忽略属性javax.net.ssl.trustStorePassword。为什么Globals.getDefaultHabitat()返回非空值?

0 个答案:

没有答案