ActiveMQ Artemis集群双向认证:证书SAN无法匹配客户端IP问题
搭建ActiveMQ Artemis 2.27.1集群并启用双向认证后,第二个节点连接第一个节点时出现SSL握手失败,错误日志如下:
WARN [org.apache.activemq.artemis.core.server] AMQ222208: SSL handshake failed for client from /10.226.95.134:46882: java.security.cert.CertificateException: No subject alternative names matching IP address 10.226.95.134 found.
客户端主机名已包含在信任库证书的SAN字段中,但无法配置acceptor使用主机名而非IP地址进行验证。当前broker.xml相关配置:
<acceptor name="netty-master-acceptor01"> tcp://dev-artemis01:61617?sslEnabled=true;needClientAuth=true;verifyHost=true;keyStorePath=/keys/keystore.jks;keyStorePassword=123;trustStorePath=/keys/trusted_keystore.jks;trustStorePassword=password;protocols=CORE,AMQP </acceptor> ... <connector name="netty-master-connector02"> tcp://artemis02:61617?sslEnabled=true;keyStorePath=/keys/keystore.jks;keyStorePassword=123;trustStorePath=/keys/trusted_keystore.jks;trustStorePassword=password </connector>
通过openssl测试SSL连接正常:
openssl s_server -accept 3000 -key dev_artemis.key -cert dev-artemis.pem -CAfile dev-artemis.pem -state openssl s_client -connect dev-artemis01:3000 -key dev_artemis.key -cert dev-artemis.pem -CAfile dev-artemis.pem -state
证书SAN字段包含对应主机名,但修改log4j2配置开启SSL日志后服务无法启动,无法进一步调试。
1. 修改Acceptor配置,启用IP反向解析
在acceptor参数中添加resolveHostName=true,让服务器将客户端的IP地址反向解析为主机名,再用该主机名匹配证书的SAN字段。修改后的acceptor配置:
<acceptor name="netty-master-acceptor01"> tcp://dev-artemis01:61617?sslEnabled=true;needClientAuth=true;verifyHost=true;resolveHostName=true;keyStorePath=/keys/keystore.jks;keyStorePassword=123;trustStorePath=/keys/trusted_keystore.jks;trustStorePassword=password;protocols=CORE,AMQP </acceptor>
2. 确保服务器能反向解析客户端IP到主机名
- 执行
nslookup 10.226.95.134测试反向解析,确认返回结果包含客户端主机名artemis02。 - 若反向解析失败,在服务器(dev-artemis01)的
/etc/hosts(Linux)或C:\Windows\System32\drivers\etc\hosts(Windows)中添加映射:10.226.95.134 artemis02
3. 确认证书SAN字段包含客户端主机名
使用keytool工具检查证书详情,确认SAN中存在客户端主机名:
keytool -printcert -v -file dev-artemis.pem
查看输出中的Subject Alternative Names部分,需包含DNS:artemis02。
4. 修复SSL日志配置(可选)
若需要调试SSL握手,在log4j2.xml中添加以下日志配置(确保格式正确):
<Logger name="org.apache.activemq.artemis.core.remoting.impl.netty" level="DEBUG"/> <Logger name="javax.net.ssl" level="DEBUG"/>
添加后重启服务,若仍无法启动,检查log4j2配置文件的语法错误(如标签未闭合、格式不符合XML规范)。
内容的提问来源于stack exchange,提问作者Milind

