插入外部 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 --set 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 2020——为了商用

Istio 在 2020 年的愿景声明及路线图。

移除跨 pod Unix domain socket

一种更安全的秘密管理方式。

Istio v1beta1 授权策略概述

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

安全管理 Webhook

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

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

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