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
$ 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果证书不支持使用通配符 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
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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
如果 TLS 证书不支持使用 DNS 名称,您必须在
ActiveMQArtemis
CR 中禁用主机验证,如下所述。
从密钥存储文件导出 TLS 证书的公钥,以便它可以导入到信任存储文件中。例如:
keytool -storetype jks -keystore server-keystore.jks -storepass artemis -alias server -exportcert -rfc > server.crt
$ keytool -storetype jks -keystore server-keystore.jks -storepass artemis -alias server -exportcert -rfc > server.crt
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将 TLS 证书的公钥导入到信任存储文件中,以便集群中的其他代理可以信任证书。例如:
keytool -storetype jks -keystore server-truststore.jks -storepass artemis -keypass artemis -importcert -alias server -file server.crt -noprompt
$ keytool -storetype jks -keystore server-truststore.jks -storepass artemis -keypass artemis -importcert -alias server -file server.crt -noprompt
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建一个机密,以存储密钥存储和信任存储文件及其关联的密码。例如:
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
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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑用于代理部署的
ActiveMQArtemis
CR,再添加名为artemis
的内部接收器。在artemis
acceptor 中,将sslEnabled
属性设置为true
,并指定您在sslSecret
属性中创建的 secret 名称。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为
artemis
连接器启用 SSL,供集群中的每个代理用来连接到集群中的其他代理。使用brokerProperties
属性启用 SSL,并指定包含 TLS 证书公钥的信任存储文件的路径和凭证。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - connectorConfigurations.artemis.params.trustStorePath
-
这个值必须与信任存储文件的位置匹配,
client.ts
在代理 pod 中。secret 中的 truststore 文件和附带的密码文件挂载到每个代理 pod 的/etc/<secret name>-volume
目录中。上例指定信任存储的位置,该位置位于名为artemis-ssl-secret
的 secret 中。
如果 TLS 证书不支持使用 DNS 名称,请使用
brokerProperties
属性来禁用主机验证。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 保存 CR。