如何通过HELM为NATS配置基于TLS的用户独立证书认证?
使用Helm配置NATS双向TLS认证(独立用户证书)
当然可以实现,下面是一套基于Helm的K8s配置方案,支持NATS双向TLS认证且每个用户使用独立客户端证书:
1. 准备证书资源
首先需要生成CA根证书,再为每个用户签发独立的客户端证书(包含证书文件、私钥),将这些证书打包成Kubernetes Secret:
- 服务器端证书Secret(供NATS集群使用):
apiVersion: v1 kind: Secret metadata: name: nats-server-tls namespace: nats type: kubernetes.io/tls data: tls.crt: <BASE64编码的服务器证书> tls.key: <BASE64编码的服务器私钥> ca.crt: <BASE64编码的CA根证书>
- 单个用户的客户端证书Secret(以用户
user-alice为例):
apiVersion: v1 kind: Secret metadata: name: nats-client-alice-tls namespace: your-app-namespace type: Opaque data: client.crt: <BASE64编码的Alice客户端证书> client.key: <BASE64编码的Alice客户端私钥> ca.crt: <BASE64编码的CA根证书> # 需与NATS服务器使用的CA一致
2. Helm Values配置(NATS集群)
修改NATS Helm Chart的values.yaml,开启双向TLS认证:
nats: tls: enabled: true secret: "nats-server-tls" caSecret: "nats-server-tls" # 指向包含CA证书的Secret verifyAndMapClients: true # 开启客户端证书验证,并将证书CN字段映射为用户身份 require: true # 强制要求客户端提供证书 auth: enabled: true tls: enabled: true allowNonTLS: false # 禁止非TLS连接
3. 用户应用连接示例
以一个NATS客户端Pod为例,挂载用户专属证书并配置连接:
apiVersion: v1 kind: Pod metadata: name: nats-client-alice namespace: your-app-namespace spec: containers: - name: nats-client image: nats:alpine command: ["nats", "pub", "--server", "nats://nats.nats.svc.cluster.local:4222", "--tlscert", "/etc/nats/tls/client.crt", "--tlskey", "/etc/nats/tls/client.key", "--tlsca", "/etc/nats/tls/ca.crt", "test.subject", "hello from alice"] volumeMounts: - name: client-tls mountPath: /etc/nats/tls readOnly: true volumes: - name: client-tls secret: secretName: nats-client-alice-tls
4. 验证要点
- 所有客户端证书必须由同一个CA签发,否则NATS会拒绝连接
verifyAndMapClients开启后,可配合NATS的权限控制规则,基于证书CN字段限制用户的发布/订阅权限- 测试时,未携带有效证书的客户端连接会被直接拒绝,只有挂载对应用户证书的Pod才能成功与NATS集群交互
内容的提问来源于stack exchange,提问作者user18377291
相关产品推荐
相关产品推荐

