Istio:检索另一个 pod 的证书详细信息

Istio: Retrieving certificate details of another pod

我试图了解如何在 Istio 中实现 mTLS 并想出了以下场景。 在我的设置中,我有一个带有两个 pods 的命名空间 foo,如下所示:

NAME                       READY   STATUS    RESTARTS   AGE
httpbin-75b47445c9-gscrn   2/2     Running   0          1d
sleep-6777b55c98-tlqb6     2/2     Running   0          1d

我的要求是从sleep获取httpbin的public证书。(仅供测试

所以我得到一个交互式 shell inside sleep 并执行 below 命令。

curl --insecure -v http://httpbin.foo:8000/ip 2>&1 | awk 'BEGIN { cert=0 } /^\* SSL connection/ { cert=1 } /^\*/ { if (cert) print }'

但是我没有得到任何输出。

但是,如果我将 http://httpbin.foo:8000/ip 替换为 http://google.com,我可以正确获取证书详细信息。

你能解释一下这里发生了什么吗?

请注意,当您 运行 curl http://httpbin.foo:8000 来自 Istio 注入的 pod 时,会发生以下情况:

  1. 您的 HTTP 请求到达您 pod 的 Istio sidecar 代理 (sleep)
  2. sidecar 代理将您的请求封装到 mTLS 连接到 httpbin.foo:8000
  3. httpbin.foo 的 sidecar 代理执行 TLS 终止(解封装原始 HTTP 请求)并将其转发给 httpbin.foo 服务
  4. httpbin.foo 服务接收原始的纯 HTTP 请求
  5. httpbin.foo 服务发送纯 HTTP 响应
  6. httpbin.foo 的 sidecar 代理封装响应和 returns 对你的 sidecar 代理的响应
  7. 你的 sidecar 代理 returns 返回给你的 curl 的响应

请注意,您的 curl 将获得 httpbin.foo 服务的普通 HTTP 响应,该服务不知道 Istio mTLS。 Istio mTLS 就像是你的 curl 和 httpbin.foo 之间通信的隧道,来自隧道的证书不会返回给你的 curl。

要获取httpbin.foo的sidecar代理证书,需要直接向httbin.foo服务发送请求(会到达httpbin.foo的sidecar代理),绕过源 pod (sleep) 的 Istio sidecar 代理。

为此,您可以在不注入 Istio 的情况下将 sleep pod 部署到某个命名空间,然后使用 openssl 检索证书:

kubectl create namespace without-istio
kubectl apply -f samples/sleep/sleep.yaml -n without-istio
kubectl exec -it $(kubectl get pod -l app=sleep -n without-istio -o jsonpath={.items..metadata.name}) -n without-istio -c sleep -- openssl s_client -connect httpbin.foo:8000