Входной контроллер Nginx - PullRequest
0 голосов
/ 06 июня 2018

Я не могу получить завершение TLS на входном контроллере nginx, работающем на моем кластере kubernetes.

мое правило доступа выглядит следующим образом:

Christophers-MacBook-Pro-2:acme-microservice cjaime$ kubectl describe ing myapp-ingress-1
Name:             myapp-ingress-1
Namespace:        default
Address:          
Default backend:  default-http-backend:80 (<none>)
TLS:
 acme-io terminates myapp-default.acme.io
Rules:
 Host                            Path  Backends
 ----                            ----  --------
 myapp-default.acme.io  
                                 /   myapp:80 (<none>)
Annotations:
 ingress.kubernetes.io/ssl-redirect:  true
 kubernetes.io/ingress.class:         nginx
Events:
 Type    Reason  Age               From                      Message
 ----    ------  ----              ----                      -------
 Normal  UPDATE  53m (x2 over 1h)  nginx-ingress-controller  Ingress default/myapp-ingress-1
 Normal  UPDATE  53m (x2 over 1h)  nginx-ingress-controller  Ingress default/myapp-ingress-1
 Normal  UPDATE  53m (x2 over 1h)  nginx-ingress-controller  Ingress default/myapp-ingress-1
 Normal  UPDATE  53m (x2 over 1h)  nginx-ingress-controller  Ingress default/myapp-ingress-1

Всякий раз, когда я пытаюсь получить доступ к этомуиз браузера я получаю обратно следующий сертификат сервера

Server certificate
subject=/O=Acme Co/CN=Kubernetes Ingress Controller Fake Certificate
issuer=/O=Acme Co/CN=Kubernetes Ingress Controller Fake Certificate

Это мешает мне создать действительное соединение SSL.Я знаю, что мой секрет верен, потому что при использовании openssl я получаю правильное соединение следующим образом

openssl s_client -servername myapp-default.acme.io -connect us1a-k8s-4.acme.io:31443 -showcerts
CONNECTED(00000003)

<content omitted>

   Start Time: 1528241749
   Timeout   : 300 (sec)
   Verify return code: 0 (ok)
---

Однако, если я запускаю ту же команду с опущенным именем сервера, я получаю тот же поддельный сертификат и ошибку соединения

openssl s_client  -connect us1a-k8s-4.acme.io:31443 -showcerts
CONNECTED(00000003)
depth=0 O = Acme Co, CN = Kubernetes Ingress Controller Fake Certificate
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 O = Acme Co, CN = Kubernetes Ingress Controller Fake Certificate
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
0 s:/O=Acme Co/CN=Kubernetes Ingress Controller Fake Certificate
  i:/O=Acme Co/CN=Kubernetes Ingress Controller Fake Certificate

<content omitted>

   Start Time: 1528241957
   Timeout   : 300 (sec)
   Verify return code: 21 (unable to verify the first certificate)

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Теперь он работает следующим образом:

До завершения SSL на входном контроллере успешный HTTP-запрос от браузера поступал на входной контроллер с установленным заголовком узла:

Chrome Browser

http://us1a-k8s-4.acme.io:31443/index.html
Host : myapp-default.acme.io

*us1a-k8s-4.acme.io is the node where nginx ingress controller 
lives.*

После обновления входного определения для использования сертификата, мы заставили это работать

curl --resolve myapp-default.acme.io:31443:172.31.0.18 https://myapp- 
default.acme.io:31443/index.html

*where 172.31.0.18 would be the IP for us1a-k8s-4.acme.io*  

, но из браузера, используя заголовок хоста, как мы использовали его ранее для запроса http, не работало.

однако, когда мы ввели в файл / etc / hosts, как показано ниже,

172.31.0.18     myapp-default.acme.io

и нажали на ссылку ниже через браузер:

http://myapp-default.acme.io:31443/index.html

ЭТО РАБОТАЛО!

Похоже, что заголовок узла не известен nginx, и он использует URL для поиска правильного сертификата.

Проверьте это https://www.claudiokuenzler.com/blog/693/curious-case-of-curl-ssl-tls-sni-http-host-header

0 голосов
/ 06 июня 2018

Ваши тесты с openssl выполнены правильно, и они показывают, что nginx предлагает действительный сертификат для myapp-default.acme.io , когда это имя хоста предоставляется в запросе через SNI ,Это согласуется с тем, что вы настроили в Ingress.

Для других имен хостов или запросов без имени хоста отправляется сертификат по умолчанию .Этот сертификат должен храниться в секрете и настраиваться с помощью параметра командной строки для входного контроллера (--default-ssl-certificate=$(POD_NAMESPACE)/tls-ingress).

Предупреждение вашего браузера вызвано либо несоответствием имени хоста, либо кэшированным поддельным сертификатом вваш браузерЯ предлагаю вам посмотреть, как очистить кэш сертификатов в вашем браузере b и / или повторить тест с помощью curl:

curl -v https://myapp-default.acme.io

Если он по-прежнему не работает должным образом, # 1954 может повлиять на вас - обновить nginx-ingress-controller.

...