52 votes

Échec de la poignée de main tls. Ne contient aucune SAN IP

Je suis en train d'essayer de configurer Logstash Forwarder, mais j'ai des problèmes pour établir un canal sécurisé. J'essaie de configurer cela avec deux machines Ubuntu (serveur 14.04) tournant sous VirtualBox. Elles sont 100% propres (le fichier hosts n'a pas été modifié et aucun autre paquet n'a été installé en dehors des packages requis tels que Java, Nginx, Elasticsearch, etc., pour Logstash)

Je ne pense pas que ce soit un problème de Logstash, mais une mauvaise manipulation des certificats ou quelque chose qui n'est pas configuré correctement sur la machine Ubuntu de Logstash ou sur la machine Forwarder.

J'ai généré les clés :

sudo openssl req -x509 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt

Ma configuration d'entrée sur le serveur Logstash :

input {
  lumberjack {
    port => 5000
    type => "logs"
    ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
    ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
  }
}

Les clés ont été copiées sur l'hôte Forwarder, qui a la configuration suivante.

{
  "network": {
    "servers": [ "192.168.2.107:5000" ],
    "timeout": 15,
    "ssl ca": "/etc/pki/tls/certs/logstash-forwarder.crt"
    "ssl key": "/etc/pki/tls/certs/logstash-forwarder.key"
  },
  "files": [
    {
      "paths": [
        "/var/log/syslog",
        "/var/log/auth.log"
       ],
      "fields": { "type": "syslog" }
    }
   ]
}

Avec le serveur Logstash en cours d'exécution, je lance 'sudo service logstash-forwarder start' sur la machine Forwarder, ce qui me donne l'erreur suivante :

Jul  9 05:06:21 ubuntu logstash-forwarder[1374]: 2014/07/09 05:06:21.589762 Connecting to [192.168.2.107]:5000 (192.168.2.107)
Jul  9 05:06:21 ubuntu logstash-forwarder[1374]: 2014/07/09 05:06:21.595105 Failed to tls handshake with 192.168.2.107 x509: cannot validate certificate for 192.168.2.107 because it doesn't contain any IP SANs
Jul  9 05:06:22 ubuntu logstash-forwarder[1374]: 2014/07/09 05:06:22.595971 Connecting to [192.168.2.107]:5000 (192.168.2.107)
Jul  9 05:06:22 ubuntu logstash-forwarder[1374]: 2014/07/09 05:06:22.602024 Failed to tls handshake with 192.168.2.107 x509: cannot validate certificate for 192.168.2.107 because it doesn't contain any IP SANs

Comme je l'ai mentionné précédemment, je ne pense pas que ce soit un problème de Logstash, mais un problème de configuration de certificat/machine. Le problème est que je n'arrive pas à le résoudre. Espérons que des esprits astucieux ici pourront m'aider ?

Merci

57voto

Steffen Ullrich Points 11972

... Échec de la poignée de main tls avec 192.168.2.107 x509 : impossible de valider le certificat pour 192.168.2.107 car il ne contient pas d'IP SAN

SSL nécessite l'identification du pair, sinon votre connexion pourrait être contre un homme du milieu qui déchiffre + renifle/modifie les données et les transmet ensuite chiffrées de nouveau vers la cible réelle. L'identification se fait avec des certificats x509 qui doivent être validés par une CA de confiance et qui doivent identifier la cible à laquelle vous voulez vous connecter.

Généralement, la cible est donnée sous la forme d'un nom d'hôte et celui-ci est vérifié par rapport au sujet et aux noms alternatifs du certificat. Dans ce cas, votre cible est une IP. Pour valider le certificat avec succès, l'IP doit être donnée dans le certificat à l'intérieur de la section des noms alternatifs du sujet, mais pas comme une entrée DNS (par exemple, un nom d'hôte) mais plutôt comme une IP.

Donc ce que vous devez faire est :

  1. Modifier votre fichier /etc/ssl/openssl.cnf sur l'hôte logstash - ajoutez subjectAltName = IP:192.168.2.107 dans la section [v3_ca].

  2. Recréez le certificat

  3. Copiez le certificat et la clé sur les deux hôtes

PS Considérez ajouter -days 365 ou plus à la ligne de commande de création du certificat car la validité par défaut du certificat est seulement de 30 jours et vous ne voulez probablement pas le recréer chaque mois.

14voto

anthony Points 13

Il existe un script pour créer des certificats appropriés pour les bûcherons qui a été mentionné sur un ticket GitHub de logstash : L'échec de l'authentification SSL car les SAN IP sont manquants

Téléchargez le fichier :

curl -O https://raw.githubusercontent.com/driskell/log-courier/1.x/src/lc-tlscert/lc-tlscert.go

...compilez-le:

go build lc-tlscert.go

..et exécutez :

./lc-tlscert 
Indiquez le Nom Commun pour le certificat. Le nom commun
peut être n'importe quoi, mais est généralement défini sur le nom DNS principal du serveur. Même si vous prévoyez de vous connecter via une adresse IP, vous devriez spécifier le nom DNS ici.

Nom commun: votre_domaine_ou_autre

La prochaine étape consiste à ajouter des noms DNS supplémentaires et des adresses IP
 que les clients peuvent utiliser pour se connecter au serveur. Si
vous prévoyez de vous connecter au serveur via une adresse IP et non un DNS
vous devez spécifier ces adresses IP ici.
Une fois que vous avez fini, appuyez simplement sur Entrée.

DNS ou adresse IP 1: 172.17.42.1 (adresse IP à faire confiance)
DNS ou adresse IP 2: 

Combien de temps le certificat doit-il être valide? Un an (365 jours)
est habituel mais nécessite que le certificat soit régénéré
dans un an sinon le certificat cessera de fonctionner.

Nombre de jours: 3650
Nom commun: quel_que_soit
SAN DNS:
    Aucun
SAN IP:
    172.17.42.1

Le certificat peut maintenant être généré
Appuyez sur n'importe quelle touche pour commencer la génération du certificat auto-signé.

Certificat généré avec succès
    Certificat: selfsigned.crt
    Clé privée: selfsigned.key

Copiez et collez ce qui suit dans votre configuration Log Courier
en ajustant les chemins si nécessaire:
    "transport": "tls",
    "ssl ca":    "chemin/vers/auto-signé.crt",

Copiez et collez ce qui suit dans votre configuration LogStash, 
en ajustant les chemins si nécessaire:
    ssl_certificate => "chemin/vers/auto-signé.crt",
    ssl_key         => "chemin/vers/auto-signé.key",

8voto

Greg Points 181

J'ai eu un vrai problème avec ça. Je n'utilise pas logstash, j'essayais simplement de faire fonctionner les IP SAN avec tls docker. Je créerais le certificat comme décrit dans l'article docker sur https (https://docs.docker.com/articles/https/), puis quand je me connectais à partir d'un client docker :

docker --tlsverify  -H tcp://127.0.0.1:2376 version

Je recevais cette erreur :

...
FATA[0000] Une erreur s'est produite en essayant de se connecter : Obtenir https://127.0.0.1:2376/v1.16/version : \
x509: ne peut pas valider le certificat pour 127.0.0.1 car il ne contient pas d'IP SAN 

ce qui me rendait fou. J'avoue, je tâtonne dans tout ce qui concerne openssl, donc, tout le monde pourrait déjà savoir ce que j'ai découvert. L'exemple de subjectAltName ici (et partout ailleurs) montre la mise à jour du fichier openssl.cnf. Je n'ai pas réussi à le faire fonctionner. J'ai fait un locate sur le openssl.cnf, copié dans un répertoire local, puis j'ai apporté les modifications. Lorsque j'ai examiné le certificat, il ne contenait pas l'extension :

openssl x509 -noout -text -in server-cert.pem

La commande utilisée pour créer ce certificat est ici (de l'article docker) :

openssl x509 -req -days 365 -in server.csr -CA ca.pem -CAkey ca-key.pem \
    -CAcreateserial -out server-cert.pem

Vous ne pouvez pas ajouter une ligne -config openssl.cnf à cette commande, ce n'est pas valide. Vous ne pouvez pas non plus copier le fichier openssl.cnf dans le répertoire actuel, le modifier et espérer que cela fonctionne de cette façon. Quelques lignes plus loin, j'ai remarqué que le certificat 'client' utilise un -extfile extfile.cnf. Donc, j'ai essayé ceci :

echo subjectAltName = IP:127.0.0.1 > extfile.cnf
openssl x509 -req -days 365 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial \
   -out server-cert.pem -extfile extfile.cnf

et cela a résolu le problème. Donc, pour une raison quelconque, ma version d'openssl ne me permettait pas de modifier le fichier openssl.cnf, mais je pouvais spécifier le subjectAltName de cette façon. Ça marche super !

Vous pouvez spécifier n'importe quel nombre d'adresses IP, comme IP:127.0.0.1,IP:127.0.1.1 (non localhost également).

2voto

Abe Points 133

Dès OpenSSL 1.1.1, fournir subjectAltName directement en ligne de commande devient beaucoup plus facile, avec l'introduction du drapeau -addext à openssl req

Exemple:

export HOST="mon.hote"
export IP="127.0.0.1"
openssl req -newkey rsa:4096 -nodes -keyout ${HOST}.key -x509 -days 365 -out ${HOST}.crt -addext 'subjectAltName = IP:${IP}' -subj '/C=US/ST=CA/L=SanFrancisco/O=MyCompany/OU=RND/CN=${HOST}/'

Inspiré par lien

0voto

Greg Dubicki Points 1111

Veuillez consulter la solution de @Steffen Ullrich ci-dessus pour la correction rapide.

Il y a également un problème en discussion concernant cela dans le projet logstash-forwarder sur Github. Consultez-le (bientôt, car le travail est actuellement en cours) pour une solution plus facile.

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