参考概述▸,AutoMQ 数据面服务基于 Kafka API,提供 mTLS 身份识别功能。本文档介绍如何配置实例的 mTLS 身份识别,以及客户端接入示例。
开启 mTLS
mTLS 协议是通过为每个客户端分配独立的 TLS 证书,在通信阶段校验证书合法性实现身份识别和校验,并对识别通过的身份主体进行 ACL 访问控制校验。
AutoMQ BYOC 环境下开启 TLS 传输加密,需要用户提供 CA 和服务端证书,并确保证书和域名匹配。后续也需要用户定期论证证书,以免证书过期导致的服务受损。
步骤 1:创建 CA 和证书
如果您的组织无法获取受信任 CA 签发的证书,则可以参考下方文档自行签发维护私有 CA 和证书。此外,生产环境推荐通过 AWS Private CA 产品管理 CA 和证书。
- 配置 CA 签名策略文件
ca.cnf
。
[ ca ]
default_ca = CA_AutoMQ_Default
[ CA_AutoMQ_Default ]
default_days = 3650
database = index.txt
serial = serial.txt
default_md = sha256
copy_extensions = copy
unique_subject = no
policy = signing_policy
[ req ]
prompt = no
distinguished_name = distinguished_name
x509_extensions = extensions
[ distinguished_name ]
organizationName = <Replace with your Orgnaization Name>
commonName = <Replace with your Common Name>
[ extensions ]
keyUsage = critical,digitalSignature,nonRepudiation,keyEncipherment,keyCertSign
basicConstraints = critical,CA:true,pathlen:1
[ signing_policy ]
organizationName = supplied
commonName = optional
- 生成 CA 私钥
ca.key
并设置文件访问权限。
openssl genrsa -out ca.key 2048
chmod 400 ca.key
- 生成 CA 公共证书
ca.crt
。
openssl req -new -x509 -config ca.cnf -key ca.key -days 3650 -batch -out ca.crt
上述命令会生成 ca.crt
文件作为 CA 公共证书,后续需要部署到 AutoMQ 实例以及 Kafka 客户端。
- 创建 Broker 证书配置文件
broker.cnf
。
AutoMQ BYOC 环境的 Broker 是以 IP 地址直接对外提供服务,因此暂不支持域名校验。因此 SAN 信息推荐保持默认值,后续客户端关闭域名校验。
[ req ]
prompt = no
distinguished_name = distinguished_name
req_extensions = extensions
[ distinguished_name ]
organizationName = <Replace with your Organization>
[ extensions ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = localhost
- 生成 Broker 私钥
broker.key
。
openssl genrsa -out broker.key 2048
- 生成 Broker 证书签名请求 CSR
broker.csr
。
openssl req -new -key broker.key -out broker.csr -nodes -config broker.cnf
- 用之前的 CA 私钥签名 CSR,生成 Broker 证书
broker.crt
。
openssl x509 -req -CA ca.crt -CAkey ca.key -in broker.csr -out broker.crt -days 365 -CAcreateserial
输出文件 broker.crt
为签名后的 Broker 证书。建议配置为只读权限。后续创建 AutoMQ 实例时需要 broker.crt
, broker.key
和 ca.crt
三个文件。
步骤 2:创建客户端证书
-
参考 管理 ACL▸,前往 AutoMQ 控制台为客户端创建 ACL 用户,并授权需要读写的 Topic 和 Group 权限,记录 ACL 用户名 。
-
创建 Client 证书配置文件
client.cnf
,将 CN 信息设置为 ACL 用户名。
说明:当使用 mTLS 协议访问 AutoMQ 实例时,服务端会默认将客户端证书的身份映射到 ACL 用户。映射规则默认设置为 RULE:.*CN=([^,]+).*/$1/。举例:客户端证书身份信息为:CN=user01,O=xxxx,OU=xxx,L=xxx,S=xxx,C=xxx则 AutoMQ 提取 CN 字段,并拼接出 Principal= User:user01。
[ req ]
prompt = no
distinguished_name = distinguished_name
req_extensions = extensions
[ distinguished_name ]
organizationName = <Replace with your Organization>
CN = <Replace with your ACL User Name>
[ extensions ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = localhost
- 生成 Client 私钥
client.key
。
openssl genrsa -out client.key 2048
- 生成 Client 证书签名请求 CSR
client.csr
。
openssl req -new -key client.key -out client.csr -nodes -config client.cnf
- 用之前的 CA 私钥签名 CSR,生成 Client 证书
client.crt
。
openssl x509 -req -CA ca.crt -CAkey ca.key -in client.csr -out client.crt -days 365 -CAcreateserial
输出文件 client.crt
为签名后的 Client 证书。后续客户端应用连接时需要 client.crt
, client.key
两个文件。
步骤 3:服务端配置
-
使用 mTLS 需要在创建实例时点击高级选项 >> 开启如下参数 ,操作界面参考下图:
-
TransitEncryption:开启 TLS Encryption。
-
Upload CA:上传上一步获取的CA 证书文件
ca.crt
。
-
Upload Server Cert:上传上一步获取的 Broker 证书文件
broker.crt
。
-
Upload Private Key:上传上一步获取的 Broker 证书的秘钥文件
broker.key
。
- 开启 mTLS 后,进入实例详情页查看对应的接入点信息。
注意:SASL_SSL 和 mTLS 协议仅支持创建实例时开启,暂不支持对已有实例开启传输加密。
步骤 4:客户端配置
Kafka 客户端使用 mTLS 协议访问服务端,参考 Apache Kafka 文档示例,需要配置相应的参数。
-
将前面生成的 CA 证书转换成 JKS trustStore。注意根据实际情况替换下方命令的参数。
-
alias:填写 CA 证书的别名。
-
file:填写上一步获取的 CA 证书文件。
-
keystore:填写 jks 的名称,后续 Kafka 客户端需要配置。
-
storepass:填写 jks 的访问密码,后续 Kafka 客户端需要配置。
keytool -importcert -alias automq-ca -file ca.crt -keystore truststore.jks -storepass changeit
-
将前面生成的客户端证书转换成 PKCS12 证书库(包含客户端秘钥)。注意根据实际情况替换下方命令的参数。
-
in:填写 客户端证书文件,上一步获取的
client.crt
。
-
inkey:填写上一步获取的客户端私钥
client.key
。
-
CAfile:填写 CA证书,上一步获取的
ca.crt
。
-
out:输出的 keystore 文件名。
-
name:输出的 keystore 别名。
-
password:设置密码
openssl pkcs12 -export -in client.crt -inkey client.key -chain -CAfile ca.crt -out client.p12 -name automq-client -password pass:changeit
- 在 Kafka 客户端配置文件中添加如下配置信息。
# Configure SSL
security.protocol=SSL
# set trust store type to JKS
ssl.truststore.type=JKS
# set the location of jks
ssl.truststore.location=/path/to/truststore.jks
# set the password of jks
ssl.truststore.password=changeit
# disable ssl hostname validation,set the algorithm to empty
ssl.endpoint.identification.algorithm=
# set the client keystore type to PKCS12
ssl.keystore.type=PKCS12
# set the client keystore jks
ssl.keystore.location=/path/to/client.p12
# set the client keystore password
ssl.keystore.password=changeit
# set the client key password
ssl.key.password=changeit
注意:在签署私有 CA 和证书时,因为无法和 AutoMQ 集群的 IP 保持匹配。因此,客户端SSL 配置时需要关闭域名校验,即 ssl.endpoint.identification.algorithm 参数设置为空字符串 。
证书过期监控
BYOC 环境 TLS 证书是由用户提供,因此用户需要对证书的有效期进行监控,确保证书过期之前进行续期轮转。AutoMQ 服务端提供了以下 Metrics 用于监控服务端证书的过期时间:
-
kafka_stream_cert_expiry_timestamp_milliseconds:用于展示当前证书过期的毫秒时间戳。
-
kafka_stream_cert_days_remaining:用于统计当前时刻到证书过期的剩余天数。
建议客户参考Prometheus 监控&报警▸ 的配置方法,使用 Prometheus、CloudWatch 等工具对证书过期时间进行监控,避免风险。