4.13. 保护集群连接
集群中的代理之间的内部连接使用内部连接器和接收器,它们都名为 artemis。您可以使用传输层安全(TLS)协议启用 SSL 来保护集群中代理之间的连接。
在启用了 SSL 的 acceptor 上,您可以指定一个 secret,其中包含集群中的所有代理的通用 TLS 证书。在启用了 SSL 的连接器中,您可以指定一个信任存储,其中包含 TLS 证书的公钥。每个代理的信任存储中都需要公钥,因此代理可以在建立 TLS 连接时信任集群中的其他代理。
以下示例演示了如何使用自签名证书保护集群中代理之间的内部连接。
流程
生成自签名 TLS 证书,并将其添加到密钥存储文件中。
在证书的
Subject Alternative Name(SAN)字段中,指定一个通配符 DNS 名称以匹配集群中的所有代理,如下例所示。这个示例基于使用在test命名空间中部署的名为ex-aao的 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创建一个 secret,以存储密钥存储和信任存储文件及其关联的密码。例如:
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
-
这个值必须与代理 pod 上的 truststore 文件
client.ts匹配。secret 中的 truststore 文件以及附带的密码文件挂载到每个代理 pod 上的/etc/<secret name>-volume目录中。前面的示例指定信任存储的位置,该存储位于名为artemis-ssl-secret的 secret 中。
如果 TLS 证书不支持使用 DNS 名称,请使用
brokerProperties属性来禁用主机验证。例如:spec: .. brokerProperties: .. - 'connectorConfigurations.artemis.params.verifyHost=false' ..- 保存 CR。