这个task展示运维如何把现有的证书和密钥插入到Istio CA中。
默认情况下,Istio CA生成自签名CA证书和密钥,并使用它们签署工作负载证书。Istio CA也可以使用运维指定证书和私钥签署工作负载证书。这个task演示了一个插入证书和密钥到Istio CA中的例子。
Before you begin
- 安装Istio。注意在 installation steps 中的第5步开启身份认证。
Plugging in the existing certificate and key
假设我们想要Istio CA使用已有的证书ca-cert.pem
和密钥 ca-key.pem
。此外,证书 ca-cert.pem
是由根证书root-cert.pem
签署的,我们希望使用 root-cert.pem
作为Istio 工作负载的根证书。
在这个例子中,因为Istio CA证书 (ca-cert.pem
)没有设置为工作负载根证书(root-cert.pem
),工作负载不能直接从根证书确认工作负载的证书。工作负载需要一个 cert-chain.pem
文件指定信任链,它应该包括工作负载和根CA间的所有中间CAs的证书。在这个例子中,它只包含CA证书,因此 cert-chain.pem
和 ca-cert.pem
相同。注意如果你的 ca-cert.pem
和root-cert.pem
相同,你可以使用空的 cert-chain.pem
文件。
下载示例文件:
rm /tmp/ca-cert.pem /tmp/ca-key.pem /tmp/root-cert.pem /tmp/cert-chain.pem
wget -P /tmp https://raw.githubusercontent.com/istio/istio/master/security/samples/plugin_ca_certs/ca-cert.pem
wget -P /tmp https://raw.githubusercontent.com/istio/istio/master/security/samples/plugin_ca_certs/ca-key.pem
wget -P /tmp https://raw.githubusercontent.com/istio/istio/master/security/samples/plugin_ca_certs/root-cert.pem
wget -P /tmp https://raw.githubusercontent.com/istio/istio/master/security/samples/plugin_ca_certs/cert-chain.pem
下面步骤能够在Istio CA中插入证书和密钥:
1.创建一个密码 cacert
,它包括所有输入文件 ca-cert.pem
, ca-key.pem
, root-cert.pem
and cert-chain.pem
:
kubectl create secret generic cacerts -n istio-system --from-file=/tmp/ca-cert.pem --from-file=/tmp/ca-key.pem \
--from-file=/tmp/root-cert.pem --from-file=/tmp/cert-chain.pem
2.重新部署Istio CA,它从密码安装文件读取证书和密钥:
kubectl apply -f install/kubernetes/istio-ca-plugin-certs.yaml
3.确认工作负载立即获取新的证书,删除Istio CA(named as istio.*)生成的密码。在这个例子中是 istio.default
。Istio CA将会为工作负载颁发新证书
kubectl delete secret istio.default
注意,如果你使用不同的证书/密钥文件或者密码名,你需要改变
istio-ca-plugin-certs.yaml
文件中的对应参数。
Verifying the new certificates
这小节中,我们核实被传播的新的工作负载证书和根证书。这需要你在机器上安装 openssl
。
1.部署bookinfo
2.检索挂载的证书
获取pods:
kubectl get pods
打印:
NAME READY STATUS RESTARTS AGE
details-v1-1520924117-48z17 2/2 Running 0 6m
productpage-v1-560495357-jk1lz 2/2 Running 0 6m
ratings-v1-734492171-rnr5l 2/2 Running 0 6m
reviews-v1-874083890-f0qf0 2/2 Running 0 6m
reviews-v2-1343845940-b34q5 2/2 Running 0 6m
reviews-v3-1813607990-8ch52 2/2 Running 0 6m
接下来,我们以pod ratings-v1-734492171-rnr5l
为例,并核实其挂载的证书。运行如下命令检索在proxy上挂载的证书:
kubectl exec -it ratings-v1-734492171-rnr5l -c istio-proxy -- /bin/cat /etc/certs/root-cert.pem > /tmp/pod-root-cert.pem
文件 /tmp/pod-root-cert.pem
应该由运维在根证书中指定。
kubectl exec -it ratings-v1-734492171-rnr5l -c istio-proxy -- /bin/cat /etc/certs/cert-chain.pem > /tmp/pod-cert-chain.pem
文件/tmp/pod-cert-chain.pem
中应该包含工作负载证书及CA证书。
3.核实根证书是否和运维指定的相同:
openssl x509 -in /tmp/root-cert.pem -text -noout > /tmp/root-cert.crt.txt
openssl x509 -in /tmp/pod-root-cert.pem -text -noout > /tmp/pod-root-cert.crt.txt
diff /tmp/root-cert.crt.txt /tmp/pod-root-cert.crt.txt
4.核实CA证书是否和运维指定的相同:
tail /tmp/pod-cert-chain.pem -n 22 > /tmp/pod-cert-chain-ca.pem
openssl x509 -in /tmp/ca-cert.pem -text -noout > /tmp/ca-cert.crt.txt
openssl x509 -in /tmp/pod-cert-chain-ca.pem -text -noout > /tmp/pod-cert-chain-ca.crt.txt
diff /tmp/ca-cert.crt.txt /tmp/pod-cert-chain-ca.crt.txt
预期输出结果为空。
5.从根证书到工作负载证书核实证书链:
head /tmp/pod-cert-chain.pem -n 18 > /tmp/pod-cert-chain-workload.pem
openssl verify -CAfile <(cat /tmp/ca-cert.pem /tmp/root-cert.pem) /tmp/pod-cert-chain-workload.pem
预期结果:
/tmp/pod-cert-chain-workload.pem: OK
Cleanup
- 移除密码
cacerts
:
kubectl delete secret cacerts -n istio-system
- 移除Istio组件:
kubectl delete -f install/kubernetes/istio-auth.yaml