我试图访问在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()返回非空值?