4.13. 保护集群连接
集群中的代理之间的内部连接使用内部连接器和接收器,它们分别命名为 artemis。您可以使用传输层安全(TLS)协议启用 SSL 来保护集群中代理间的连接。
在启用了 SSL 的接收器上,您可以指定一个 secret,其中包含集群中所有代理的通用 TLS 证书。在启用了 SSL 的连接器中,您可以指定一个信任存储,其中包含 TLS 证书的公钥。每个代理的信任存储中都需要公钥,因此代理可以在建立 TLS 连接时信任集群中的其他代理。
以下示例流程描述了如何使用自签名证书保护集群中代理之间的内部连接。
流程
生成自签名 TLS 证书,并将它添加到密钥存储文件中。
在证书的
Subject Alternative Name(SAN)字段中,指定一个通配符 DNS 名称以匹配集群中的所有代理,如下例所示。该示例基于使用名为ex-aao的 CR,该 CR 部署到测试命名空间中。$ keytool -storetype jks -keystore server-keystore.jks -storepass artemis -keypass artemis -alias server -genkey -keyalg "RSA" -keysize 2048 -dname "CN=AMQ Server, OU=Artemis, O=ActiveMQ, L=AMQ, S=AMQ, C=AMQ" -validity 365 -ext bc=ca:false -ext eku=sA -ext san=dns:*.ex-aao-hdls-svc.test.svc.cluster.local如果证书不支持使用通配符 DNS 名称,您可以在集群中所有代理 pod 的证书的
SAN字段中包含以逗号分隔的 DNS 名称列表。例如:keytool -storetype jks -keystore server-keystore.jks -storepass artemis -keypass artemis -alias server -genkey -keyalg "RSA" -keysize 2048 -dname "CN=AMQ Server, OU=Artemis, O=ActiveMQ, L=AMQ, S=AMQ, C=AMQ" -validity 365 -ext bc=ca:false -ext eku=sA -ext san=dns:ex-aao-ss-0.ex-aao-hdls-svc.test.svc.cluster.local,dns:ex-aao-ss-1.ex-aao-hdls-svc.test.svc.cluster.local-
如果 TLS 证书不支持使用 DNS 名称,您必须在
ActiveMQArtemisCR 中禁用主机验证,如下所述。
从密钥存储文件导出 TLS 证书的公钥,以便它可以导入到信任存储文件中。例如:
$ keytool -storetype jks -keystore server-keystore.jks -storepass artemis -alias server -exportcert -rfc > server.crt将 TLS 证书的公钥导入到信任存储文件中,以便集群中的其他代理可以信任证书。例如:
$ keytool -storetype jks -keystore server-truststore.jks -storepass artemis -keypass artemis -importcert -alias server -file server.crt -noprompt创建一个机密,以存储密钥存储和信任存储文件及其关联的密码。例如:
oc create secret generic artemis-ssl-secret --namespace test --from-file=broker.ks=server-keystore.jks --from-file=client.ts=server-truststore.jks --from-literal=keyStorePassword=artemis --from-literal=trustStorePassword=artemis编辑用于代理部署的
ActiveMQArtemisCR,再添加名为artemis的内部接收器。在artemisacceptor 中,将sslEnabled属性设置为true,并指定您在sslSecret属性中创建的 secret 名称。例如:spec: .. deploymentPlan: size: 2 acceptors: - name: artemis port: 61616 sslEnabled: true sslSecret: artemis-ssl-secret ..为
artemis连接器启用 SSL,供集群中的每个代理用来连接到集群中的其他代理。使用brokerProperties属性启用 SSL,并指定包含 TLS 证书公钥的信任存储文件的路径和凭证。spec: .. deploymentPlan: size: 2 acceptors: - name: artemis port: 61616 sslEnabled: true sslSecret: artemis-ssl-secret brokerProperties: - 'connectorConfigurations.artemis.params.sslEnabled=true' - 'connectorConfigurations.artemis.params.trustStorePath=/etc/artemis-ssl-secret-volume/client.ts' - 'connectorConfigurations.artemis.params.trustStorePassword=artemis' ..- connectorConfigurations.artemis.params.trustStorePath
-
这个值必须与信任存储文件的位置匹配,
client.ts在代理 pod 中。secret 中的 truststore 文件和附带的密码文件挂载到每个代理 pod 的/etc/<secret name>-volume目录中。上例指定信任存储的位置,该位置位于名为artemis-ssl-secret的 secret 中。
如果 TLS 证书不支持使用 DNS 名称,请使用
brokerProperties属性来禁用主机验证。例如:spec: .. brokerProperties: .. - 'connectorConfigurations.artemis.params.verifyHost=false' ..- 保存 CR。