该任务显示了如何使用已经存在的根证书管理配置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.

  1. $ kubectl create namespace istio-system
  2. $ kubectl create secret generic cacerts -n istio-system --from-file=samples/certs/ca-cert.pem \
  3. --from-file=samples/certs/ca-key.pem --from-file=samples/certs/root-cert.pem \
  4. --from-file=samples/certs/cert-chain.pem
  1. 使用demo的配置文件部署istio

Istio的CA将会从挂载的secret文件读取证书和key

  1. $ istioctl manifest apply --set profile=demo

2. 部署案例服务

  1. 部署httpbin和sleep的案例服务
  1. $ kubectl create ns foo
  2. $ kubectl apply -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n foo
  3. $ kubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n foo
  1. 在foo名称空间中部署一个针对工作流的策略,仅接受双向TLS流量
  1. $ kubectl apply -n foo -f - <<EOF
  2. apiVersion: "security.istio.io/v1beta1"
  3. kind: "PeerAuthentication"
  4. metadata:
  5. name: "default"
  6. spec:
  7. mtls:
  8. mode: STRICT
  9. EOF

3. 校验证书

  1. 在检索httpbin的证书链之前,先等待20s让mTLS策略生效。 由于CA证书是自签名的,这个校验verify error:num=19:self signed certificate in certificate chain error返回如下。
  1. $ 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
  1. 在证书链上分析证书
  1. $ sed -n '/-----BEGIN CERTIFICATE-----/{:start /-----END CERTIFICATE-----/!{N;b start};/.*/p}' httpbin-proxy-cert.txt > certs.pem
  2. awk 'BEGIN {counter=0;} /BEGIN CERT/{counter++} { print > "proxy-cert-" counter ".pem"}' < certs.pem
  1. 校验根证书
  1. $ openssl x509 -in samples/certs/root-cert.pem -text -noout > /tmp/root-cert.crt.txt
  2. $ openssl x509 -in ./proxy-cert-3.pem -text -noout > /tmp/pod-root-cert.crt.txt
  3. $ diff -s /tmp/root-cert.crt.txt /tmp/pod-root-cert.crt.txt
  1. 校验CA证书
  1. $ openssl x509 -in samples/certs/ca-cert.pem -text -noout > /tmp/ca-cert.crt.txt
  2. $ openssl x509 -in ./proxy-cert-2.pem -text -noout > /tmp/pod-cert-chain-ca.crt.txt
  3. $ diff -s /tmp/ca-cert.crt.txt /tmp/pod-cert-chain-ca.crt.txt
  1. 从根证书到工作流证书校验证书链
  1. $ openssl verify -CAfile <(cat samples/certs/ca-cert.pem samples/certs/root-cert.pem) ./proxy-cert-1.pem
  1. 清空本实验
  1. $ kubectl delete secret cacerts -n istio-system
  2. $ kubectl delete ns foo istio-system