8 votes

ERR_SSL_PROTOCOL_ERROR sur un ingress/service kubernetes qui fonctionne normalement.

J'ai un déploiement nginx de base et un certificat existant émis par let's encrypt via cert-manager. Je pensais que tout était en place pour commencer à utiliser le certificat mais je ne peux pas me connecter sur https.

La connexion à l'IP du LoadBalancer et au domaine fonctionne. La connexion au domaine avec https est impossible. Chrome dit ERR_SSL_PROTOCOL_ERROR Firefox dit SSL_ERROR_RX_RECORD_TOO_LONG et SSL Labs dit Assessment failed: No secure protocols supported . C'est toujours le même problème.

Voici le service :

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

Voici l'entrée :

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

Le certificat est rempli :

kubectl describe secret
...
Data
====
tls.crt:  3574 bytes
tls.key:  1675 bytes
ca.crt:   0 bytes

Et la ressource du certificat est détenue par la bonne entrée. J'ai remplacé mon domaine par "exemple" ci-dessus.

Il semble que tout soit en place mais je ne sais pas pourquoi je ne peux pas me connecter via https. Que puis-je faire pour résoudre ce problème ?

MISE À JOUR : J'ai découvert qu'il me manquait certaines configurations pour mon déploiement et mon image nginx. J'ai suivi toutes les étapes ici : https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/#securing-the-service

Comme auparavant, je peux me connecter à l'IP de LoadBalancer sur 443 et 80, mais la connexion https échoue. Cela fonctionne avec http :

curl http://<EXTERNAL-IP> -k
<html>
<h1>Hello!</h1>
  <p>Stay tuned for launch!</p>
</html>

Échec avec https :

curl https://<EXTERNAL-IP> -k
curl: (35) error:1400410B:SSL routines:CONNECT_CR_SRVR_HELLO:wrong version number

5voto

Archonic Points 304

Le problème dans ce cas était la combinaison du déploiement et du service. Je routais le trafic https vers le port 80 avec cette ligne dans le yaml du service :

- name: https
  protocol: TCP
  port: 443
  targetPort: 80

Il n'a pas été en mesure de compléter une poignée de main SSL, ce qui est ce que la curl: (35) error:1400410B:SSL routines:CONNECT_CR_SRVR_HELLO:wrong version number était à propos.

J'ai pensé que cela serait correct car sur un service précédent avec SSL fonctionnel, je routais les ports 80 et 443 vers 3000 sur puma. Je ne suis pas sûr de ce qui se passerait si je routais 443 vers 80 sur puma, mais c'est certainement cassé avec nginx. En modifiant le yaml du service ci-dessus, le problème a été résolu (après avoir vérifié que nginx écoutait sur 443 et que le SSL était activé avec la commande listen 443 ssl; dans default.conf) :

- name: https
  protocol: TCP
  port: 443
  targetPort: 443

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X