У меня есть базовое развертывание nginx и существующий сертификат, выданный Let's encrypt через cert-manager. Я думал, что все готово, чтобы начать использовать сертификат, но я не могу подключиться по https.
Подключение к IP LoadBalancer и домену работает. При подключении к домену с https не удается подключиться. Chrome говорит ERR_SSL_PROTOCOL_ERROR
, Firefox говорит SSL_ERROR_RX_RECORD_TOO_LONG
и SSL Labs говорит Assessment failed: No secure protocols supported
. Это все та же проблема.
Вот услуга:
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: example
labels:
app: example
spec:
type: LoadBalancer
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
- name: https
protocol: TCP
port: 443
targetPort: 80
selector:
app: example
Вот вход:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx
namespace: example
annotations:
cert-manager.io/cluster-issuer: letsencrypt-production
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
spec:
tls:
- hosts:
- 'example.com'
secretName: example-production-tls
rules:
- host: example.com
http:
paths:
- path: /
backend:
serviceName: nginx
servicePort: 443
Сертификат заполняется:
kubectl describe secret
...
Data
====
tls.crt: 3574 bytes
tls.key: 1675 bytes
ca.crt: 0 bytes
И ресурс сертификата принадлежит правильному входу. Я заменил свой домен на "пример" выше.
Кажется, все на месте, но я не уверен, почему не могу подключиться через https. Что я могу запустить для устранения этой проблемы?
ОБНОВЛЕНИЕ: я обнаружил, что у меня отсутствуют некоторые конфигурации для развертывания и образа nginx. Я выполнил все шаги здесь: https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/#securing-the-service
Как и раньше, я могу подключиться к IP-адресу LoadBalancer на 443 и 80, но соединение https не работает. Работа с http:
curl http://<EXTERNAL-IP> -k
<html>
<h1>Hello!</h1>
<p>Stay tuned for launch!</p>
</html>
Ошибка https:
curl https://<EXTERNAL-IP> -k
curl: (35) error:1400410B:SSL routines:CONNECT_CR_SRVR_HELLO:wrong version number
В данном случае проблема заключалась в сочетании развертывания и обслуживания. Я перенаправлял трафик https на порт 80 с помощью этой строки в служебном yaml:
- name: https
protocol: TCP
port: 443
targetPort: 80
Это не удалось завершить рукопожатие SSL, что является причиной curl: (35) error:1400410B:SSL routines:CONNECT_CR_SRVR_HELLO:wrong version number
было около.
Я думал, что это будет нормально, потому что в предыдущей службе с работающим SSL я маршрутизировал порт 80 и 443 на 3000 на puma. Я не уверен, что произойдет, если маршрутизировать с 443 на 80 на puma, но это определенно сломалось с nginx. Изменение вышеуказанного сервисного yaml это решило (после того, как nginx прослушивал 443 и включил SSL с listen 443 ssl;
в default.conf):
- name: https
protocol: TCP
port: 443
targetPort: 443