Nous avons des problèmes avec curl
ne pas se connecter à un serveur HTTPS:
$ curl https://the-problem-site.com (not the real URL!)
curl: (35) error:14077458:SSL routines:SSL23_GET_SERVER_HELLO:reason(1112)
1112 est SSL_R_TLSV1_UNRECOGNIZED_NAME
dans ssl.h
.
Si j'essaie plutôt openssl s_client -connect the-problem-site.com:443
alors je vois
CONNECTED(00000003)
depth=1 /C=US/O=GeoTrust, Inc./CN=GeoTrust SSL CA
verify error:num=20:unable to get local issuer certificate
verify return:0
Certificate chain
0 s:/serialNumber=xx/C=xx/ST=xx/L=xxxx/O=xx/OU=xx/CN=the-problem-site.com
i:/C=US/O=GeoTrust, Inc./CN=GeoTrust SSL CA
1 s:/C=US/O=GeoTrust, Inc./CN=GeoTrust SSL CA
i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
c'est-à-dire qu'il semble que le problème est qu'il ne fait pas confiance à /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
. Cependant, ce cert est installé: c’est /etc/ssl/certs/GeoTrust_Global_CA.pem
et si j’exécute plutôt
openssl s_client -connecte le-problem-site.com:443 -CAfile /etc/ssl/certs/GeoTrust_Global_CA.pem
alors tout fonctionne. Le certificat est également présent sous la forme d'un fichier nommé [HOMME] b0f3e76e.0
et il se trouve dans ca-certificates.crt
. Cependant, autant que je sache, ni curl ni openssl ne tentent de lire des certificats; si je strace
alors aucune tentative de lecture de /usr/lib/ssl/certs
ou /etc/ssl/certs
, même avec des erreurs. Il lit cependant openssl.cnf. Nous avons exécuté update-ca-certificates
.
C'est Ubuntu 10.04 avec openssl 0.9.8k. Nous pouvons reproduire le problème sur deux installations distinctes (même s’il est possible que l’on soit un clone de l’autre depuis le passé). Si j'essaie le même test sur un CentOS VM avec openssl 0.9.8e, alors cela fonctionne bien et je peux le voir lire le fichier de certificat dans strace
. Il n’ya pas d’accès équivalent au fichier au même endroit dans les couches Ubuntu. Si je copie le fichier openssl.cnf
du CentOS VM sur les machines Ubuntu, cela ne fait aucune différence. Il n'y a rien d'évident dans l'environnement ou dans un fichier .rc qui pourrait être la cause.
Des idées que je fais mal? Cela devrait-il fonctionner, c’est-à-dire si openssl et curl devaient récupérer automatiquement les autorités de certification installées à partir de la ligne de commande? Comment est-ce configuré? Merci!
Un autre point de données: sur une nouvelle installation du serveur 13, curl
récupère le fichier de certificats et fonctionne correctement. openssl s_client
ne le fait toujours pas. Pourquoi serait-ce?
Il existe plusieurs bibliothèques cryptographiques sur votre système:
Tous ont, bien sûr, des similitudes et des différences. Les logiciels qui les utilisent (à des fins cryptographiques ou pour utiliser SSL/TLS) prennent parfois en charge l’utilisation de plusieurs de ces bibliothèques (par exemple, Lynx, le navigateur Web, est normalement lié à OpenSSL mais prend également en charge GnuTLS (mais pas aussi bien)). apaiser les GNU personnes).
cURL est également l’un des projets prenant en charge l’utilisation de l’une des trois principales bibliothèques de chiffrement. Cela est principalement dû au fait que cURL est, à l’origine, une bibliothèque destinée à être utilisée par d’autres programmes qui souhaitent télécharger (ou même télécharger) des éléments à l’aide de connexions http, ftp, etc. L'outil de ligne de commande curl
peut provenir de l'une ou l'autre de ces variantes.
Maintenant, je suis à peu près sûr que le problème que vous rencontrez avec le système non-fraîchement installé est le suivant:
OpenSSL et GnuTLS prennent tous deux en charge l’utilisation de répertoires d’autorité de certification de style /etc/ssl/certs/<hash>.<number>
-. OpenSSL version 0.x et GnuTLS utilisent toutefois un algorithme différent pour calculer le hachage susmentionné de celui utilisé par OpenSSL version 1.x. (Les deux peuvent co-exister sur un système; si différents certificats ont le même dièse , vous utilisez simplement un nombre différent mais, pour une raison quelconque, le paquet ca-certificates
de Debian/Ubuntu ne semble pas le faire.) De plus, certaines versions de GnuTLS ne prenaient pas en charge l’utilisation du répertoire, mais uniquement file /etc/ssl/certs/ca-certificates.crt
(généralement géré par les scripts de maintenance du package ca-certificates
, mais peut différer); vous semblez utiliser une version plus ancienne, alors c'est peut-être ce que vous avez frappé.
openssl s_client
par défaut (c'est-à-dire sans l'option -CApath
ou -CAfile
) ne recherche pas nulle part les certificats.
Votre curl
de l'installation mise à niveau utilise probablement une bibliothèque de chiffrement différente de celle de curl
de la nouvelle installation.
Essayez openssl s_client -CAfile /etc/ssl/certs/ca-certificates.crt -connect the-problem-site.com:443
en plus de openssl s_client -CApath /etc/ssl/certs -connect the-problem-site.com:443
pour imiter le comportement d'anciennes versions de GnuTLS.
Vérifiez deux fois s'il y a un OpenSSL 1.x n'importe où sur votre système (Ubuntu est connu pour avoir inséré des mises à jour majeures même dans les versions LTS), et si oui, vérifiez le hash du fichier:
openssl x509 -noout -hash -in /etc/ssl/certs/GeoTrust_Global_CA.pem
openssl x509 -noout -subject_hash_old -in /etc/ssl/certs/GeoTrust_Global_CA.pem
openssl x509 -noout -subject_hash -in /etc/ssl/certs/GeoTrust_Global_CA.pem
Normalement, les deuxième et troisième commandes doivent échouer (OpenSSL 0.x) ou les première et troisième commandes doivent afficher le même hachage, mais la deuxième doit afficher un hachage différent (OpenSSL 1.x). GnuTLS utiliserait le résultat de la deuxième commande (si OpenSSL 1.x est installé); Si OpenSSL 0.x est installé, c'est le même hachage. Vous pouvez créer de tels liens symboliques manuellement.
Je peux mettre à jour cette publication une fois que vous avez fourni des informations de débogage.