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

Istio:正在检索另一个pod的证书详细信息,istio,Istio,我试图理解mTLS是如何在Istio中实现的,并提出了以下场景。 在我的设置中,我有一个带有两个pod的名称空间foo,如下所示: NAME READY STATUS RESTARTS AGE httpbin-75b47445c9-gscrn 2/2 Running 0 1d sleep-6777b55c98-tlqb6 2/2 Running 0 1d 我的要求是

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

NAME                       READY   STATUS    RESTARTS   AGE
httpbin-75b47445c9-gscrn   2/2     Running   0          1d
sleep-6777b55c98-tlqb6     2/2     Running   0          1d
我的要求是从
sleep
检索
httpbin
的公共证书(仅用于测试目的)

因此,我在sleep中获得了一个交互式shell并执行该命令

但我没有从中得到任何结果

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


请您解释一下这里发生了什么。

请注意,当您运行
curl时http://httpbin.foo:8000
从Istio注入吊舱中,发生以下情况:

  • 您的HTTP请求到达pod的Istio sidecar代理(
    sleep
  • sidecar代理将您的请求封装到到httpbin.foo:8000的mTLS连接中
  • httpbin.foo
    的侧车代理执行TLS终止(解除原始HTTP请求的封装)并将其转发给
    httpbin.foo
    服务
  • httpbin.foo
    服务接收原始的普通HTTP请求
  • httpbin.foo
    服务发送一个简单的HTTP响应
  • httpbin.foo
    的sidecar代理封装响应并将响应返回给sidecar代理
  • sidecar代理将响应返回给curl
  • 注意,您的curl将获得
    httpbin.foo
    服务的普通HTTP响应,该服务不知道Istio mTLS。Istio mTLS就像curl和
    httpbin.foo
    之间通信的隧道,隧道中的证书不会返回到curl

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

    为此,您可以将
    sleep
    pod部署到某个名称空间,而不使用Istio注入,然后使用
    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
    

    请注意,当您运行
    curl时http://httpbin.foo:8000
    从Istio注入吊舱中,发生以下情况:

  • 您的HTTP请求到达pod的Istio sidecar代理(
    sleep
  • sidecar代理将您的请求封装到到httpbin.foo:8000的mTLS连接中
  • httpbin.foo
    的侧车代理执行TLS终止(解除原始HTTP请求的封装)并将其转发给
    httpbin.foo
    服务
  • httpbin.foo
    服务接收原始的普通HTTP请求
  • httpbin.foo
    服务发送一个简单的HTTP响应
  • httpbin.foo
    的sidecar代理封装响应并将响应返回给sidecar代理
  • sidecar代理将响应返回给curl
  • 注意,您的curl将获得
    httpbin.foo
    服务的普通HTTP响应,该服务不知道Istio mTLS。Istio mTLS就像curl和
    httpbin.foo
    之间通信的隧道,隧道中的证书不会返回到curl

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

    为此,您可以将
    sleep
    pod部署到某个名称空间,而不使用Istio注入,然后使用
    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
    

    你能从中得到什么吗?@Crou没有。当我尝试ping它时,我得到了
    ping:bad address'http://httpbin.foo:8000/ip
    。当我做
    curl-v时http://httpbin.foo:8000/ip
    我得到了一个
    200 OK
    …你能从中得到什么吗?@Crou没有。当我尝试ping它时,我得到了
    ping:bad address'http://httpbin.foo:8000/ip
    。当我做
    curl-v时http://httpbin.foo:8000/ip
    我得到一个
    200 OK
    。。。