插入外部 CA 密钥和证书

本任务展示运维人员如何使用现有根证书配置 Citadel 进行证书以及密钥的签发。

缺省情况下 Citadel 生成自签署的根证书和密钥,用于给工作负载签署证书。Citadel 还可以使用运维人员指定的根证书、证书和密钥进行工作负载的证书颁发。该任务所演示了向 Citadel 插入外部证书和密钥的方法。

开始之前

插入现有密钥和证书

假设我们想让 Citadel 使用现有的 ca-cert.pem 证书和 ca-key.pem,其中 ca-cert.pem 是由 root-cert.pem 根证书签发的,我们也准备使用 root-cert.pem 作为 Istio 工作负载的根证书。

下面的例子中,Citadel 的签署(CA)证书(root-cert.pem)不同于根证书(root-cert.pem),因此工作负载无法使用根证书进行证书校验。工作负载需要一个 cert-chain.pem 文件作为信任链,其中需要包含所有从根证书到工作负载证书之间的中间 CA。在我们的例子中,他包含了 Citadel 的签署证书,所以 cert-chain.pemca-cert.pem 是一致的。注意如果你的 ca-cert.pemca-cert.pem 是一致的,那么 cert-chain.pem 就是个空文件了。

这些文件都会在 samples/certs/ 目录中准备就绪提供使用。

下面的步骤在 Citadel 中插入了证书和密钥:

  • 创建一个名为 cacert 的 secret,其中包含所有输入文件 ca-cert.pemca-key.pemroot-cert.pem 以及 cert-chain.pem
  1. $ kubectl create secret generic cacerts -n istio-system --from-file=samples/certs/ca-cert.pem \
  2. --from-file=samples/certs/ca-key.pem --from-file=samples/certs/root-cert.pem \
  3. --from-file=samples/certs/cert-chain.pem
  • global.mtls.enabled 设置为 truesecurity.selfSigned 设置为 false,重新部署 Citadel。
  1. $ istioctl manifest apply --set values.global.mtls.enabled=true,values.security.selfSigned=false
  • 为了确定工作负载获取了正确的证书,删除 Citadel 生成的 Secret(命名为 istio.*)。在本例中就是 istio.default。Citadel 会签发新的证书给工作负载。
  1. $ kubectl delete secret istio.default

检查新证书

本节中,我们要校验新的工作负载证书以及根证书是否正确传播。需要在本机安装 openssl

  • 根据部署文档安装 Bookinfo 应用。

  • 获取已加载的证书。下面我们使用 ratings pod 作为例子,检查这个 Pod 上加载的证书。

用变量 RATINGSPOD 保存 Pod 名称:

  1. $ RATINGSPOD=`kubectl get pods -l app=ratings -o jsonpath='{.items[0].metadata.name}'`

运行下列命令,获取 proxy 容器中加载的证书:

  1. $ kubectl exec -it $RATINGSPOD -c istio-proxy -- /bin/cat /etc/certs/root-cert.pem > /tmp/pod-root-cert.pem

/tmp/pod-root-cert.pem 文件中包含传播到 Pod 中的根证书。

  1. $ kubectl exec -it $RATINGSPOD -c istio-proxy -- /bin/cat /etc/certs/cert-chain.pem > /tmp/pod-cert-chain.pem

/tmp/pod-cert-chain.pem 这个文件则包含了工作负载证书以及传播到 Pod 中的 CA 证书

  • 检查根证书和运维人员指定的证书是否一致:

Zip

  1. $ openssl x509 -in @samples/certs/root-cert.pem@ -text -noout > /tmp/root-cert.crt.txt
  2. $ openssl x509 -in /tmp/pod-root-cert.pem -text -noout > /tmp/pod-root-cert.crt.txt
  3. $ diff /tmp/root-cert.crt.txt /tmp/pod-root-cert.crt.txt

输出为空代表符合预期。

  • 检查 CA 证书和运维人员指定的是否一致

Zip

  1. $ sed '0,/^-----END CERTIFICATE-----/d' /tmp/pod-cert-chain.pem > /tmp/pod-cert-chain-ca.pem
  2. $ openssl x509 -in @samples/certs/ca-cert.pem@ -text -noout > /tmp/ca-cert.crt.txt
  3. $ openssl x509 -in /tmp/pod-cert-chain-ca.pem -text -noout > /tmp/pod-cert-chain-ca.crt.txt
  4. $ diff /tmp/ca-cert.crt.txt /tmp/pod-cert-chain-ca.crt.txt

输出为空代表符合预期。

  • 检查从根证书到工作负载证书的证书链:

ZipZip

  1. $ head -n 21 /tmp/pod-cert-chain.pem > /tmp/pod-cert-chain-workload.pem
  2. $ openssl verify -CAfile <(cat @samples/certs/ca-cert.pem@ @samples/certs/root-cert.pem@) /tmp/pod-cert-chain-workload.pem
  3. /tmp/pod-cert-chain-workload.pem: OK

清理

  • 移除 secret cacerts
  1. $ kubectl delete secret cacerts -n istio-system
  2. $ istioctl manifest apply --set values.global.mtls.enabled=true

相关内容

DNS 证书管理

在 Istio 中配置和管理 DNS 证书。

Istio v1beta1 授权策略概述

Istio v1beta1 授权策略的设计原则、基本概述及迁移操作。

安全管理 Webhook

一种更安全管理 Istio webhook 的方法。

用于隔离和边界保护的多网格部署

将需要隔离的环境部署到单独的网格中,并通过网格联邦启用网格间通信。

APP 身份和访问适配器

使用 Istio 实现零代码改动保护多云 Kubernetes 应用。

Istio 1.2.4 sidecar 镜像漏洞

由于错误的发布操作,出现了错误的 1.2.4 sidecar 镜像。