Istio: Получение сведений о сертификате другого модуля - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь понять, как mTLS реализован в Istio и придумал сценарий ниже.В моей настройке у меня есть пространство имен foo с двумя модулями, как показано ниже:

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

Мое требование - получить общедоступный сертификат httpbin из sleep. ( Только для целей тестирования )

Так что я получаю интерактивную оболочку внутри сна и выполняю команду ниже .

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, я смогу правильно получить информацию о сертификате.

Не могли бы вы объяснить, что здесь происходит.

1 Ответ

0 голосов
/ 03 декабря 2018

Обратите внимание, что при запуске curl http://httpbin.foo:8000 из модуля, внедренного в Istio, происходит следующее:

  1. Ваш HTTP-запрос поступает на прокси-сервер Istio колоды вашего модуля (sleep)
  2. Прокси-сервер sidecar инкапсулирует ваш запрос в соединение mTLS с httpbin.foo:8000
  3. Прокси-сервер sidecar httpbin.foo выполняет завершение TLS (декапсулирует исходный HTTP-запрос) и перенаправляет его на httpbin.fooслужба
  4. Служба httpbin.foo получает исходный простой HTTP-запрос
  5. Служба httpbin.foo отправляет простой HTTP-ответ
  6. Прокси-сервер боковой панели httpbin.foo инкапсулируетответ и возвращает ответ вашему прокси-серверу
  7. Ваш прокси-сервер возвращает ответ обратно вашему curl

Обратите внимание, что ваш curl получит простой HTTP-ответ службы httpbin.foo,который не знает об Istio mTLS.Istio mTLS похож на туннель для связи между вашим curl и httpbin.foo, сертификат из туннеля не будет возвращен вашему curl.

Чтобы получить сертификат прокси-сервера sidecar httpbin.foo, вынеобходимо отправить запрос в службу httbin.foo напрямую (она поступит на прокси-сервер колонтитула httpbin.foo), минуя прокси-сервер колонтитула Istio вашего исходного модуля (sleep).

Для этого вы можетеразверните модуль sleep в некоторое пространство имен без внедрения 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
...