Skip to main content

Mutal TLS (mTLS) 身份识别

参考概述▸,AutoMQ 数据面服务基于 Kafka API,提供 mTLS 身份识别功能。本文档介绍如何配置实例的 mTLS 身份识别,以及客户端接入示例。

开启 mTLS

mTLS 协议是通过为每个客户端分配独立的 TLS 证书,在通信阶段校验证书合法性实现身份识别和校验,并对识别通过的身份主体进行 ACL 访问控制校验。

AutoMQ BYOC 环境下开启 TLS 传输加密,需要用户提供 CA 和服务端证书,并确保证书和域名匹配。后续也需要用户定期论证证书,以免证书过期导致的服务受损。

步骤 1:创建 CA 和证书

如果您的组织无法获取受信任 CA 签发的证书,则可以参考下方文档自行签发维护私有 CA 和证书。此外,生产环境推荐通过 AWS Private CA 产品管理 CA 和证书。

  1. 配置 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

  1. 生成 CA 私钥 ca.key 并设置文件访问权限。

openssl genrsa -out ca.key 2048
chmod 400 ca.key

  1. 生成 CA 公共证书 ca.crt

openssl req -new -x509 -config ca.cnf -key ca.key -days 3650 -batch -out ca.crt

上述命令会生成 ca.crt 文件作为 CA 公共证书,后续需要部署到 AutoMQ 实例以及 Kafka 客户端。

  1. 创建 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

  1. 生成 Broker 私钥 broker.key

openssl genrsa -out broker.key 2048

  1. 生成 Broker 证书签名请求 CSR broker.csr

openssl req -new -key broker.key -out broker.csr -nodes -config broker.cnf

  1. 用之前的 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.crtbroker.keyca.crt 三个文件。

步骤 2:创建客户端证书

  1. 参考 管理 ACL▸,前往 AutoMQ 控制台为客户端创建 ACL 用户,并授权需要读写的 Topic 和 Group 权限,记录 ACL 用户名

  2. 创建 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

  1. 生成 Client 私钥 client.key

openssl genrsa -out client.key 2048

  1. 生成 Client 证书签名请求 CSR client.csr

openssl req -new -key client.key -out client.csr -nodes -config client.cnf

  1. 用之前的 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.crtclient.key 两个文件。

步骤 3:服务端配置

  1. 使用 mTLS 需要在创建实例时点击高级选项 >> 开启如下参数 ,操作界面参考下图:

    • TransitEncryption:开启 TLS Encryption。

    • Upload CA:上传上一步获取的CA 证书文件 ca.crt

    • Upload Server Cert:上传上一步获取的 Broker 证书文件 broker.crt

    • Upload Private Key:上传上一步获取的 Broker 证书的秘钥文件 broker.key

  1. 开启 mTLS 后,进入实例详情页查看对应的接入点信息。

注意:SASL_SSL 和 mTLS 协议仅支持创建实例时开启,暂不支持对已有实例开启传输加密。

步骤 4:客户端配置

Kafka 客户端使用 mTLS 协议访问服务端,参考 Apache Kafka 文档示例,需要配置相应的参数。

  1. 将前面生成的 CA 证书转换成 JKS trustStore。注意根据实际情况替换下方命令的参数。

    1. alias:填写 CA 证书的别名。

    2. file:填写上一步获取的 CA 证书文件。

    3. keystore:填写 jks 的名称,后续 Kafka 客户端需要配置。

    4. storepass:填写 jks 的访问密码,后续 Kafka 客户端需要配置。


keytool -importcert -alias automq-ca -file ca.crt -keystore truststore.jks -storepass changeit

  1. 将前面生成的客户端证书转换成 PKCS12 证书库(包含客户端秘钥)。注意根据实际情况替换下方命令的参数。

    1. in:填写 客户端证书文件,上一步获取的 client.crt

    2. inkey:填写上一步获取的客户端私钥 client.key

    3. CAfile:填写 CA证书,上一步获取的 ca.crt

    4. out:输出的 keystore 文件名。

    5. name:输出的 keystore 别名。

    6. password:设置密码


openssl pkcs12 -export -in client.crt -inkey client.key -chain -CAfile ca.crt -out client.p12 -name automq-client -password pass:changeit

  1. 在 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 等工具对证书过期时间进行监控,避免风险。