我试图了解Istio中如何实现mTLS,并提出了以下方案。 在我的设置中,我有一个带有两个容器的名称空间foo,如下所示:
NAME READY STATUS RESTARTS AGE
httpbin-75b47445c9-gscrn 2/2 Running 0 1d
sleep-6777b55c98-tlqb6 2/2 Running 0 1d
我的要求是从httpbin
检索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
,则可以正确获取证书详细信息。
能否请您解释一下这里发生的事情。
答案 0 :(得分:3)
请注意,当您从注入Istio的pod运行curl http://httpbin.foo:8000
时,会发生以下情况:
sleep
)的Istio Sidecar代理httpbin.foo
的sidecar代理执行TLS终止(解封原始HTTP请求)并将其转发到httpbin.foo
服务httpbin.foo
服务接收原始的原始HTTP请求httpbin.foo
服务发送简单的HTTP响应httpbin.foo
的sidecar代理封装了响应,并将响应返回给您的sidecar代理请注意,您的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
容器部署到某个名称空间,然后使用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