Comment réparer curl: (60) Certificat SSL: chaîne de certificats non valide lors de l'utilisation de sudo


12

Ainsi, depuis la mise à niveau Mavericks, la boucle a plus de problèmes avec les certificats.

Lorsque j'essayais de boucler un fichier de mon serveur Web avec son certificat auto-signé, il obtenait l'erreur "Certificat SSL: chaîne de certificats non valide".

Cela a été corrigé en ajoutant le certificat à mon trousseau système et en le configurant pour toujours autoriser SSL, les informations que j'ai trouvées ici et ici .

Cela fonctionne bien et lorsque je recourbe un fichier, il se télécharge correctement.

Cependant, si j'exécute curl avec sudo avant (par exemple, j'ai un script qui doit être exécuté avec sudo et fait une boucle dedans), je reviens au même message d'erreur.

Je suppose que root ne lit peut-être pas le trousseau système?

Quelqu'un connaît-il un moyen de résoudre ce problème?

Réponses:


17

Si vous stockez vos certificats CA sur le système de fichiers (au format PEM), vous pouvez dire à curl de les utiliser avec

sudo curl --cacert /path/to/cacert.pem ...

Vous pouvez également désactiver la vérification de certificat avec

sudo curl --insecure ...

Edit: mis à jour en ce qui concerne les commentaires

Si vous souhaitez définir cela de manière permanente, vous devez créer un .curlrcfichier et le placer dans votre répertoire personnel. sudoles commandes peuvent avoir besoin de ce fichier dans /var/rootLe fichier prend les mêmes options que la ligne de commande mais sans les tirets. Une option par ligne:

cacert=/path/to/my/certs.pem

Merci pour votre réponse, le script exécuté avec sudo provient d'un tiers et je ne peux donc pas vraiment modifier la commande curl elle-même. L'insécurité n'est pas vraiment une option. Cela peut-il être fait à l'échelle mondiale?
Jacob Tomlinson

Vous pouvez créer un fichier .curlrc et le stocker dans votre dossier personnel, bien que l'utilisation de sudo doive être obligatoirement /var/root/.curlrc. Le fichier doit contenir des options sans tirets, une par ligne. Donc "cacert = / path / to / my / certs.pem"
Dan

1
+1 pour configurer un root-disponible .curlrcau lieu de --insecure. Ce qui est exactement comme il est dit: pour un attaquant en position de réseau, cela serait trivial pour MITM et injecterait du code.
zigg

Merci pour cela, ça ressemble à ce que je cherche. Je vais l'essayer demain et accorder une prime si cela fonctionne.
Jacob Tomlinson

6

Root ne lit pas à partir des paramètres de confiance utilisateur actuels, mais il existe à la fois des paramètres de confiance administrateur et des paramètres de confiance spécifiques à l'utilisateur racine. (Ils sont également distincts des paramètres d'approbation du système .) Notez également que les paramètres d'approbation de certificat sont quelque peu différents de l'ajout d'un certificat à un trousseau; vous pouvez marquer un certificat comme approuvé sans l'ajouter complètement. (La situation exacte ici n'est pas claire pour moi et les documents que j'ai vus sont vagues.)

Vous pouvez marquer un certificat comme approuvé pour votre utilisateur actuel comme

$ security add-trusted-cert /path/to/cert.pem

mais cela n'aide pas avec root. La solution, comme vous pouvez maintenant le deviner, est soit sudocelle ci-dessus, qui la marque ensuite comme approuvée spécifiquement pour l'utilisateur root:

$ sudo security add-trusted-cert /path/to/cert.pem

ou pour utiliser l' -dindicateur pour l'ajouter aux paramètres de confiance de l'administrateur:

$ security add-trusted-cert -d /path/to/cert.pem

(OS X affichera une boîte de dialogue de mot de passe pour confirmer celle-ci.)

L'un ou l'autre de ces deux derniers semble suffisant sudo curl.

Référence: https://developer.apple.com/library/mac/Documentation/Darwin/Reference/ManPages/man1/security.1.html


Comme je l'ai dit dans la question, je les ai déjà ajoutés au trousseau système ainsi qu'au trousseau de connexion.
Jacob Tomlinson

Avez-vous réellement essayé ce que j'ai suggéré? Je l'ai testé, exactement dans la situation que vous décrivez, et cela a fonctionné. Je ne suis pas clair sur tous les détails - la documentation est vague - mais vous devez savoir que les paramètres d'approbation de certificat NE SONT PAS tout à fait synonymes simplement en ajoutant le certificat à un trousseau, et que les paramètres d'approbation de certificat administrateur existent séparément du système et paramètres utilisateur / porte-clés. (Il semble également y avoir un ensemble de paramètres utilisateur spécifiques à l'utilisateur root dans le mélange.) J'ai modifié ma réponse pour être plus clair sur ce point. Veuillez essayer cette solution.
Wes Campaigne

Oui, j'ai essayé cette solution lors de votre première publication. Les certificats sont dans le trousseau système et définis comme approuvés. Toujours pas de chance.
Jacob Tomlinson

5

C'est vraiment dans l'indice de sortie:

echo insecure >> ~/.curlrc

L'avantage de l'utilisation de la solution ci-dessus est qu'elle fonctionne pour toutes les curlcommandes, mais elle n'est pas recommandée car elle peut introduire des attaques MITM en se connectant à des hôtes non sécurisés et non approuvés.


2

Si vous utilisez MacPorts (et que le script tiers que vous avez mentionné ne le supprime pas $PATHou n'appelle pas /usr/bin/curl), vous pouvez installer les ports certsyncet curldans cet ordre.

certsyncest un outil et une liste de lancement correspondante qui exportera votre trousseau système $prefix/etc/openssl/cert.pemet installera un lien symbolique $prefix/share/curl/curl-ca-bundle.crt -> $prefix/etc/openssl/cert.pemafin que MacPorts curl récupère automatiquement les certificats. certsyncmettra également à jour automatiquement les fichiers générés lorsque vous modifiez votre trousseau système.


Merci pour cela, je voudrais cependant éviter d'utiliser MacPorts si possible.
Jacob Tomlinson


-1

Pour sudo curlfonctionner (sur OSX Sierra), nous avons dû importer le certificat dans le System.keychainet y faire confiance. Cela pourrait être fait manuellement dans l'application Porte-clés ou en utilisant cette commande:

sudo security add-trusted-cert -d -k /Library/Keychains/System.keychain /path/to/cert.pem

Il était important de spécifier -det de définir manuellement le chemin d'accès au trousseau système via -kpour vous assurer que le certificat y est réellement importé s'il ne l'est pas encore.

La commande fonctionne sans sudo, mais demanderait ensuite le mot de passe via une boîte de dialogue d'interface utilisateur, ce qui pourrait être un obstacle pour les scripts.


Je reçois l'erreurSecCertificateCreateFromData: Unknown format in import.
rraallvv

Quiconque a voté en bas, sachez que j'ai clairement écrit "sur OSX Sierra" et que c'était une solution de travail pour nous. Si cela ne fonctionne pas dans les versions OSX plus récentes, cela peut être dû au fait que la prise en charge ou les outils OSX ont changé. Ou un problème comme le commentateur précédent, où le fichier d'entrée n'est pas dans un format pris en charge (la question ne le précise pas).
Alexander Klimetschek
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.