0

我全新安装了 Red Hat AMQ 6.3.0.redhat-187。我知道它很旧,但这是我必须使用的。我正在尝试在 Java 客户端和服务器之间设置相互身份验证。我只希望允许证书身份验证。

我有 TLS 部分工作,因为我可以通过安全通道连接,如果客户端不提供受信任的证书,它就无法登录。我正在努力将客户端证书映射到用户。

我用来连接的 Java 代码是:

ActiveMQSslConnectionFactory connectionFactory = new ActiveMQSslConnectionFactory();
connectionFactory.setBrokerURL("ssl://servername:61617");
connectionFactory.setTrustStore(truststore);
connectionFactory.setTrustStorePassword(truststorePassword);
connectionFactory.setKeyStore(keystore);
connectionFactory.setKeyStorePassword(keystorePassword);

我收到了这个异常:

javax.security.auth.login.LoginException: Username can not be null
    at org.apache.karaf.jaas.modules.properties.PropertiesLoginModule.login(PropertiesLoginModule.java:90)
    at org.apache.karaf.jaas.boot.ProxyLoginModule.login(ProxyLoginModule.java:83)

如果我指定存储在${activemq.base}/conf/users.properties文件中的用户名/密码,我可以创建一个会话:

connectionFactory.setUserName("test");
connectionFactory.setPassword("test");

但我想使用证书而不是用户名和密码进行身份验证。这让我相信我的服务器配置不正确,但我是 JBoss AMQ 的新手,我不确定自己做错了什么。

如果我没有指定密钥库(即注释掉两个密钥库行),我会得到SSLHandshakeException: Received fatal alert: bad_certificate预期的结果。这让我认为我的客户证书已正确通过,但它并没有被用来识别客户。

我已经尝试通过更新文件配置 JAAS 公钥登录模块,如下所述:InstallDir/etc/keys.properties

testUser=AAAAB3N<TheRestOfThePublicKey>,_g_:admingroup
_g_\:admingroup = admin,admin,manager,viewer, Operator, Maintainer, Deployer, Auditor, Administrator, SuperUser

但没有运气。

除了包含元素并且只允许单个元素外,我activemq.xml几乎没有更改文件,如下所示:sslContexttransportConnector

<sslContext>
   <sslContext 
        keyStore="file:<pathToKeyStore>"
        keyStorePassword="<KeyStorePassword>"
        trustStore="file:<pathToTrustStore> "
        trustStorePassword="<trustStorePassword"/>
</sslContext>
...
<transportConnectors>
    <transportConnector name="ssl" uri="ssl://0.0.0.0:61617?needClientAuth=true"/>
</transportConnectors>

我知道在配置服务器端时我缺少一些东西,但我不确定它是什么。我已经努力通过谷歌等寻找解决方案,但没有运气。我希望这里有人能指出我正确的方向。

4

0 回答 0