该任务显示了如何使用已经存在的根证书管理配置istio证书授权机构,签发证书和key。
默认的,Istio’s CA产生一个自签的根证书和key, 并且使用它们去签发工作流的证书。Istio’s CA可以使用管理员指定的证书和key去签发工作流的证书。
1. 使用已存的证书和key
下面步骤是把证书和key、ca-cert.pem,ca-key.pem, root-cert.pem和cert-chain.pem转换成kubernetes secret.
$ kubectl create namespace istio-system
$ kubectl create secret generic cacerts -n istio-system --from-file=samples/certs/ca-cert.pem \
--from-file=samples/certs/ca-key.pem --from-file=samples/certs/root-cert.pem \
--from-file=samples/certs/cert-chain.pem
- 使用demo的配置文件部署istio
Istio的CA将会从挂载的secret文件读取证书和key
$ istioctl manifest apply --set profile=demo
2. 部署案例服务
- 部署httpbin和sleep的案例服务
$ kubectl create ns foo
$ kubectl apply -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n foo
$ kubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n foo
- 在foo名称空间中部署一个针对工作流的策略,仅接受双向TLS流量
$ kubectl apply -n foo -f - <<EOF
apiVersion: "security.istio.io/v1beta1"
kind: "PeerAuthentication"
metadata:
name: "default"
spec:
mtls:
mode: STRICT
EOF
3. 校验证书
- 在检索httpbin的证书链之前,先等待20s让mTLS策略生效。 由于CA证书是自签名的,这个校验
verify error:num=19:self signed certificate in certificate chain error
返回如下。
$ sleep 20; kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c istio-proxy -n foo -- openssl s_client -showcerts -connect httpbin.foo:8000 > httpbin-proxy-cert.txt
- 在证书链上分析证书
$ sed -n '/-----BEGIN CERTIFICATE-----/{:start /-----END CERTIFICATE-----/!{N;b start};/.*/p}' httpbin-proxy-cert.txt > certs.pem
awk 'BEGIN {counter=0;} /BEGIN CERT/{counter++} { print > "proxy-cert-" counter ".pem"}' < certs.pem
- 校验根证书
$ openssl x509 -in samples/certs/root-cert.pem -text -noout > /tmp/root-cert.crt.txt
$ openssl x509 -in ./proxy-cert-3.pem -text -noout > /tmp/pod-root-cert.crt.txt
$ diff -s /tmp/root-cert.crt.txt /tmp/pod-root-cert.crt.txt
- 校验CA证书
$ openssl x509 -in samples/certs/ca-cert.pem -text -noout > /tmp/ca-cert.crt.txt
$ openssl x509 -in ./proxy-cert-2.pem -text -noout > /tmp/pod-cert-chain-ca.crt.txt
$ diff -s /tmp/ca-cert.crt.txt /tmp/pod-cert-chain-ca.crt.txt
- 从根证书到工作流证书校验证书链
$ openssl verify -CAfile <(cat samples/certs/ca-cert.pem samples/certs/root-cert.pem) ./proxy-cert-1.pem
- 清空本实验
$ kubectl delete secret cacerts -n istio-system
$ kubectl delete ns foo istio-system