如何使用 SSL
社区 > 常见问题解答 > 使用 Apache ActiveMQ Classic > 如何使用 SSL
设置密钥和信任库
有关更多信息,另请参阅 Tomcat 的 SSL 说明。以下内容由 Colin Kilburn 提供。感谢 Colin!
ActiveMQ Classic 默认使用虚拟凭据
ActiveMQ Classic 包含引用虚拟自签名证书的密钥和信任库。当您为您的安装创建代理证书和库时,请覆盖 conf 目录中的值,或删除现有的虚拟密钥和信任库,以避免它们造成干扰。)
- 使用 keytool 为代理创建证书
keytool -genkey -alias broker -keyalg RSA -keystore broker.ks
- 导出代理的证书,以便与客户端共享
keytool -export -alias broker -keystore broker.ks -file broker_cert
- 为客户端创建证书/密钥库
keytool -genkey -alias client -keyalg RSA -keystore client.ks
- 为客户端创建信任库,并导入代理的证书。这将建立客户端“信任”代理
keytool -import -alias broker -keystore client.ts -file broker_cert
启动代理
使用 javax.net.ssl.* 系统属性
在启动代理的 VM 之前,设置 ACTIVEMQ_SSL_OPTS 环境变量,以便它知道使用代理密钥库。(请注意,在 ActiveMQ Classic 的先前版本中,此属性在某些脚本中被称为 SSL_OPTS。从 v5.12.0 开始,所有脚本都使用 ACTIVEMQ_SSL_OPTS)
export ACTIVEMQ_SSL_OPTS = -Djavax.net.ssl.keyStore=/path/to/broker.ks -Djavax.net.ssl.keyStorePassword=password
使用 Spring 为代理实例配置 SSL
有时 javax.net.ssl.* 系统属性的使用不合适,因为它们会影响 JVM 中的所有 SSL 用户。ActiveMQ Classic 5.2.x 在中添加了一个元素,允许配置特定于代理的 SSL 属性集。
SslContext 测试用例 验证了使用代理 Xbean 中指定的配置启动 SSL 传输监听器。SslContext 元素按如下方式添加到代理中
SslContext 用于为该代理配置 SslTransportFactory。可以在 模式定义 中或在 org.apache.activemq.spring.SpringSslContext 的访问器中查看可用的配置选项的完整详细信息
启动客户端
启动客户端的 VM 时,请指定以下系统属性
javax.net.ssl.keyStore=/path/to/client.ks
javax.net.ssl.keyStorePassword=password
javax.net.ssl.trustStore=/path/to/client.ts
在 Linux 中,不要使用密钥库的绝对路径。默认情况下,keytool 使用 ~/.keystore
,但在某些设置中,将 -Djavax.net.ssl.keyStore=/home/account/.keystore
传递给 Java VM 无法正常工作。这不是 ActiveMQ Classic 特有的问题,但无论如何都要记住这一点。
客户端证书
如果要验证客户端证书,则需要采取一些额外的步骤
- 导出客户端的证书,以便与代理共享
keytool -export -alias client -keystore client.ks -file client_cert
- 为代理创建信任库,并导入客户端的证书。这将建立代理“信任”客户端
keytool -import -alias client -keystore broker.ts -file client_cert
- 添加
-Djavax.net.ssl.trustStore=/path/to/broker.ts
到
ACTIVEMQ_SSL_OPTS
- 通过在 activemq.xml 中设置以下内容,指示 ActiveMQ Classic 要求进行客户端身份验证
证书吊销
从版本 **5.12** 开始,您可以在 ssl 上下文中定义证书吊销列表 (CRL) 路径,以便可以吊销无效证书
<sslContext>
<sslContext keyStore="org/apache/activemq/security/broker1.ks"
keyStorePassword="password"
trustStore="org/apache/activemq/security/activemq-revoke.jks"
trustStorePassword="password"
crlPath="org/apache/activemq/security/activemq-revoke.crl"/>
</sslContext>
此列表是静态的,并在代理启动时加载。
从版本 **5.14.0** 开始,您还可以启用更高级的在线证书状态协议 (OCSP) 协议。为此,您需要通过设置适当的系统属性(在 ${ACTIVEMQ_HOME}/bin/env
中)来配置 java.security
配置扩展的位置,例如
ACTIVEMQ_SSL_OPTS="-Djava.security.properties=$ACTIVEMQ_CONF/java.security"
然后,您需要在 java.security
文件中配置 OCSP 响应程序属性,例如
ocsp.enable=true ocsp.responderURL=<http://ocsp.example.net:80>
可以在 https://github.com/dejanb/sslib 中找到与 OCSP 响应程序一起工作的代理配置的演示
解决 Java 7 SSL 错误
如问题 AMQ-5970 所述,似乎某些版本的 Java 7 存在与需要使用 Diffie-Hellman 密码套件的 SSL 会话相关的问题。如果您遇到此问题,只需将 Bouncy Castle bcprov-jdk15on-148.jar 复制到 ActiveMQ Classic 的 lib 目录并重新启动代理。
有用链接
这些链接可能也有帮助