0
votes

Kubettes 1.14.2 ha maître nginx charge balancer log.go: 172] http: TLS Handshake Erreur à partir de 192.168.5.32:43148: Erreur à distance: TLS: Bad certificat

Cela me rend fou, je ne suis pas un expert Kubettes mais je ne suis pas non plus novice.

J'ai essayé sans succès pendant trois jours pour avoir passé cette question, mais je ne peux pas et je suis à la fin de mon Corde. P>

Je peux interroger le cluster de mon bureau après avoir copié les certificats de (Kube-apiserver-1: / etc / kubernet / pKi / *) sur mon bureau. P>

cat /etc/kubernetes/manifest/kube-apiserver.yaml
...
  - command:
    - kube-apiserver
    - --advertise-address=192.168.5.29
    - --allow-privileged=true
    - --authorization-mode=Node,RBAC
    - --client-ca-file=/etc/kubernetes/pki/ca.crt
    - --enable-admission-plugins=NodeRestriction
    - --enable-bootstrap-token-auth=true
    - --etcd-servers=http://etcd-cluster.mydomain.com:2379
    - --insecure-port=0
    - --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt
    - --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key
    - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
    - --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt
    - --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key
    - --requestheader-allowed-names=front-proxy-client
    - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
    - --requestheader-extra-headers-prefix=X-Remote-Extra-
    - --requestheader-group-headers=X-Remote-Group
    - --requestheader-username-headers=X-Remote-User
    - --secure-port=6443
    - --service-account-key-file=/etc/kubernetes/pki/sa.pub
    - --service-cluster-ip-range=10.96.0.0/12
    - --tls-cert-file=/etc/kubernetes/pki/apiserver.crt
    - --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
    image: k8s.gcr.io/kube-apiserver:v1.14.2
    imagePullPolicy: IfNotPresent
...


2 commentaires

Bad Certificat indique que le serveur que vous essayez de vous connecter nécessite un certificat client et que vous n'en fournissez pas un ou envoyé celui que le serveur n'accepte pas. Le - client-ca-fichier dans votre kube-apiserver.yaml manifeste active l'authentification du certificat client. Dans vos différents exemples de sortie CURL , vous ne montrez que la demande, pas les réponses, il n'est donc pas possible de dire ce que le serveur répond - je suppose que ce n'est pas une réponse de 200 OK?


OK, cela commence donc à sentir que la couche 7 que j'utilise Nginx est censée être une couche 4 lb qui transfère les certificats clients. Tandis que dans la documentation pour créer un kubettes ha ( kubetites.io/docs/setup/independante/high-Availability/.../a>) Il semble que cela fonctionne comme si cela fonctionnerait le calque 7 Nginx Server peut ne pas transmettre les certificats clients comme je l'ai lu dans quelques autres questions comme Celui-ci: ServerFault .com / questions / 835984 / ... . Pourquoi ne rend pas cela clair dans les docs?


3 Réponses :


0
votes

Votre configuration NGinx actuelle ne configure pas un client client. SSL_CERTIFICATE CODE> est le certificat du serveur, si vous souhaitez présenter un client client à KUBERNETES-API-CLUSTER CODE> Vous devrez configurer NGinx pour transférer le certificat client entrant. J'ai déjà fait cela en utilisant proxy_set_header x-ssl-cert $ ssl_client_escaped_cert code> ( Documentation )

upstream kubernetes-api-cluster { 
    server 192.168.5.19:6443;
    server 192.168.5.29:6443; 
} 

server { 
    listen 6443;
    ssl_certificate /etc/nginx/ssl/kube-apiserver.pem;
    ssl_certificate_key /etc/nginx/ssl/private/kube-apiserver.key;
    ssl_prefer_server_ciphers on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;
    proxy_pass kubernetes-api-cluster; 

    #forward incoming client certificate
    ssl_verify_client optional; #requests the client certificate and verifies it if the certificate is present
    proxy_set_header X-SSL-CERT $ssl_client_escaped_cert;
}


18 commentaires

Cela ne fera-t-il pas que chaque demande client ressemble à celle de la même "utilisateur"? Que suggérez-vous que j'utilise comme clientcert.pem?


@Danielmaldonado Vous êtes correct, ça va. Allez-vous fournir des certificats de clients distincts de chaque client se connectant à l'API via NGinx?


@Danielmaldonado et quant à ce que j'utiliserais comme clientcert.pem . J'utiliserais n'importe quel certificat qui valide avec la CA que vous avez configurée dans - client-ca-file = / etc / kubettes / pki / ca.crt


Chaque nœud qui appartient au cluster aura son propre ensemble de certificats. Je crois que votre suggestion rendrait l'ensemble de la grappe. Une couche 7 Nginx lb peut-elle être des certificats avant?


Si vous voulez utiliser des TLS mutuels, alors je suis d'accord. Cela rendrait l'insécurité du cluster. Vous pouvez l'utiliser juste pour tester cependant. J'ai fait transférer des certs clients dans une vieille configuration Nginx. Laissez-moi voir si je peux creuser


Vous savez, la seule chose qui me souffle, c'est que je ne peux pas être le seul à avoir ce problème. Je n'ai aucune idée de la manière dont les autres personnes ont configuré un cluster HA derrière un Nginx lb. Il n'y a aucun moyen que c'était facile pour personne.


J'ai fourni une mise à jour, voir si cela ne résout pas votre problème.


Arggghhhhh ... 26 mai 14:44:28 Équilibreur de charge NGinx [26460]: NGinx: [SIGH] "PROXY_PASS" La directive n'est pas autorisée ici dans / etc / nginx / Sites activé / KubeNettes-API: 13


Donc, je mets les trucs dans un bloc d'emplacement et je reçois: 26 mai 14:54:45 Balance de charge NGinx [26605]: NGinx: [SIGH] NO SSL_CLIENT_CERTIFICATE POUR SSL_CLIENT_VERIFY


Je n'ai pas pu trouver mon ancienne config qui a transmis le client entrant, mais j'aurais peut-être encore plus de temps pour le chercher demain. Pourriez-vous essayer ssl_verify_client optionnroud_no_ca ( Documentation )


Nope, cela n'a pas fonctionné non plus. Obtenir toujours l'erreur d'origine: I0526 15: 55: 51.990243 1 log.go: 172] http: TLS Handshake Erreur de 192.168.5.32:36638: Erreur à distance: TLS: Bad Certificat I0526 15: 55: 52.102702 1 LOG.GO: 172 ] Http: TLS Handshake Erreur de 192.168.5.32:36640: Erreur à distance: TLS: Bad certificat. Quelle était cette configuration qui envoiait le client Cert? Je devrais peut-être faire cela juste pour avoir dépassé cette erreur, puis revenez et résout cela plus.


Consultez le modifier les révisions à la réponse. Cela étant dit, envoyez-vous un certificat client des clients à travers Nginx?


Ok, je devrais peut-être expliquer cela un peu plus. Je ne vais pas au-delà du point de configuration d'un seul serveur API avant de commencer à rechercher cette exception. Donc, toutes les erreurs qui se produisent sur le serveur ont à voir avec le serveur agissant en tant que client si l'équilibreur de chargement Nginx. Donc, le Septir lui-même est de se plaindre qu'il ne peut pas valider le client car le Nginx ne transfère pas les certificats clients d'une couche 7 lb.


Après tout ce travail, la chose qui échoue à la vérification de la santé Nginx est réelle. Est-ce que quelqu'un a une configuration d'équilibreur de charge TCP qui spécifie ...: 6443 / Healthz en tant que contrôle de santé. J'ai déjà une configuration de couche 4, mais cela ne fonctionne pas du tout.


@Danielmaldonado Malheureusement, je n'ai pas pu trouver cet ancien config. Cela faisait partie d'une preuve de concept que j'ai fait un moment de retour mais ce n'était jamais contrôlé de la version.


Ne vous inquiétez pas, le problème est le chèque de santé de l'équilibreur de charge. Comme il n'a pas de certificat, il lance cette exception. Ce serait formidable si nous avions un chèque de santé qui n'avait pas besoin d'un certificat: - / C'est toujours un problème et je devrai travailler à ce sujet une fois que le cluster est complètement stable, nous venons de renverser des chèques de guérison dans la LB. . Ce n'est pas une solution idéale mais il nous a eu le point de voir constamment l'exception dans le journal.


C'était intéressant pour moi d'apprendre, que «TLS Handshake Error» observée dans Kube-Apiserver Les journaux se produisent en réalité lors des chèques de santé. @Daniel Maldonado, diriez-vous de résumer vos conclusions dans les commentaires sous forme de post-mise à jour, ou de la publication Wiki.


C'était mon erreur, j'avais une erreur de configuration du pare-feu et que tous les tests ont indiqué qu'il s'agissait de l'équilibreur de charge qui sonder le kube-apiscerver en fait ce n'est pas le cas. Le problème était totalement local sur l'API-Server lui-même. Si quelqu'un passe à ce point, veuillez vérifier que tous les ports sont disponibles sur le serveur API I.E. LOOPBACK.



0
votes

Ceci est plus une idée de dépannage pour cibler vraiment la source du problème. Si vous pouvez le faire:

kubectl --kubeconfig [workstation location]/admin.conf get nodes


0 commentaires

0
votes

La cause première de la question initiale était (citant l'auteur de cet article @Daniel Maldonado):

C'était mon erreur, j'ai eu une erreur de configuration du pare-feu et tout Les tests ont indiqué qu'il s'agissait de l'équilibreur de charge sondant la Kube-apiserver quand ce n'est en fait pas. Le problème était complètement local au serveur API lui-même. Si quelqu'un arrive à ce point, veuillez vérifier que tous les ports sont disponibles sur le serveur API de lui-même, c'est-à-dire. Loopback.


0 commentaires