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 时,会发生以下情况:
- 您的 HTTP 请求到达您 pod 的 Istio sidecar 代理 (
sleep
)
- sidecar 代理将您的请求封装到 mTLS 连接到 httpbin.foo:8000
httpbin.foo
的 sidecar 代理执行 TLS 终止(解封装原始 HTTP 请求)并将其转发给 httpbin.foo
服务
httpbin.foo
服务接收原始的纯 HTTP 请求
httpbin.foo
服务发送纯 HTTP 响应
httpbin.foo
的 sidecar 代理封装响应和 returns 对你的 sidecar 代理的响应
- 你的 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
我试图了解如何在 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 时,会发生以下情况:
- 您的 HTTP 请求到达您 pod 的 Istio sidecar 代理 (
sleep
) - sidecar 代理将您的请求封装到 mTLS 连接到 httpbin.foo:8000
httpbin.foo
的 sidecar 代理执行 TLS 终止(解封装原始 HTTP 请求)并将其转发给httpbin.foo
服务httpbin.foo
服务接收原始的纯 HTTP 请求httpbin.foo
服务发送纯 HTTP 响应httpbin.foo
的 sidecar 代理封装响应和 returns 对你的 sidecar 代理的响应- 你的 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