我全新安装了 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
几乎没有更改文件,如下所示:sslContext
transportConnector
<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>
我知道在配置服务器端时我缺少一些东西,但我不确定它是什么。我已经努力通过谷歌等寻找解决方案,但没有运气。我希望这里有人能指出我正确的方向。