Je travaille sur un script simple qui implique CAS, vérification de sécurité jspring, redirection, etc. Je voudrais utiliser les requêtes python de Kenneth Reitz parce que c'est un excellent travail! Cependant, CAS nécessite d'être validé via SSL, je dois donc passer cette étape en premier. Je ne sais pas quelles demandes Python manquent? Où ce certificat SSL est-il censé résider?
Traceback (most recent call last):
File "./test.py", line 24, in <module>
response = requests.get(url1, headers=headers)
File "build/bdist.linux-x86_64/egg/requests/api.py", line 52, in get
File "build/bdist.linux-x86_64/egg/requests/api.py", line 40, in request
File "build/bdist.linux-x86_64/egg/requests/sessions.py", line 209, in request
File "build/bdist.linux-x86_64/egg/requests/models.py", line 624, in send
File "build/bdist.linux-x86_64/egg/requests/models.py", line 300, in _build_response
File "build/bdist.linux-x86_64/egg/requests/models.py", line 611, in send
requests.exceptions.SSLError: [Errno 1] _ssl.c:503: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
python
ssl
python-requests
urllib3
TedBurrows
la source
la source
Réponses:
Le problème que vous rencontrez est dû à un certificat SSL non approuvé.
Comme @dirk mentionné dans un commentaire précédent, la solution la plus rapide consiste à définir
verify=False
:Veuillez noter que cela entraînera la non-vérification du certificat. Cela exposera votre application à des risques de sécurité, tels que des attaques d'homme au milieu.
Bien sûr, appliquez votre jugement. Comme mentionné dans les commentaires, cela peut être acceptable pour les applications / scripts rapides / jetables, mais ne devrait vraiment pas aller au logiciel de production .
Si le simple fait d'ignorer la vérification du certificat n'est pas acceptable dans votre contexte particulier, envisagez les options suivantes, votre meilleure option est de définir le
verify
paramètre sur une chaîne qui est le chemin du.pem
fichier du certificat (que vous devriez obtenir par une sorte de sécurité veux dire).Ainsi, à partir de la version 2.0, le
verify
paramètre accepte les valeurs suivantes, avec leur sémantique respective:True
: entraîne la validation du certificat par rapport aux autorités de certification de confiance de la bibliothèque (Remarque: vous pouvez voir les demandes de certificats racine utilisées via la bibliothèque Certifi, une base de données de confiance des CR extraites de Requests: Certifi - Trust Database for Humans ).False
: contourne complètement la validation du certificat .Source: Demandes - SSL Cert Verification
Jetez également un œil au
cert
paramètre sur le même lien.la source
verify=False
désactive la vérification du certificat SSL de l'hôte.De la documentation des demandes sur la vérification SSL :
Si vous ne souhaitez pas vérifier votre certificat SSL, faites
verify=False
la source
Le nom du fichier CA à utiliser peut être transmis via
verify
:Si vous utilisez, utilise
verify=True
alorsrequests
son propre ensemble d'autorités de certification qui pourrait ne pas avoir l'autorité de certification qui a signé votre certificat de serveur.la source
requests
peut être emballé pour votre distribution. Courezpython -mrequests.certs
pour savoir où il pointe.cacert.pem
depuis curl. Il contient de nombreux certificats révoqués. Découvrez Certifi (que Requests utilise): certifi.iocacert.pem
est-ce que les certificats CA sont extraits de Mozilla (par cURL) - ce n'est qu'un exemple (si la liste CA utilisée par un site Web populaire) -browser ne peut pas être utilisé comme exemple alors je ne sais pas ce qui peut être) - le point de la réponse que vous pouvez passer votre propre fichier CA si la liste par défaut échoue.$ pip install -U requests[security]
Lorsque cette question a été ouverte (2012-05), la version des demandes était 0.13.1. Sur la version 2.4.1 (2014-09), les extras "sécurité" ont été introduits, en utilisant le
certifi
package si disponible.À l'heure actuelle (2016-09), la version principale est 2.11.1, qui fonctionne bien sans
verify=False
. Pas besoin d'utiliserrequests.get(url, verify=False)
, si installé avec desrequests[security]
extras.la source
pip install -U requests[security] --no-cache
deux fois etpip install certifi==2015.04.28
pip install --upgrade pip
avant d'installer le paquet de sécurité des demandes pour éviter d'autres erreursJ'ai rencontré le même problème et le certificat SSL vérifie que le problème a échoué lors de l'utilisation de aws boto3, en examinant le code boto3, j'ai trouvé que le
REQUESTS_CA_BUNDLE
n'est pas défini, j'ai donc résolu le problème en le définissant manuellement:Pour aws-cli, je suppose que la définition de REQUESTS_CA_BUNDLE
~/.bashrc
corrigera ce problème (non testé car mon aws-cli fonctionne sans).la source
Dans le cas où vous avez une bibliothèque sur laquelle
requests
vous vous appuyez et que vous ne pouvez pas modifier le chemin de vérification (comme avecpyvmomi
), vous devrez trouver lecacert.pem
paquet avec les demandes et y ajouter votre autorité de certification. Voici une approche générique pour trouver l'cacert.pem
emplacement:les fenêtres
linux
btw. @ requests-devs, regrouper vos propres cacerts avec request est vraiment, vraiment ennuyeux ... surtout le fait que vous ne semblez pas utiliser le système ca en premier et ce n'est documenté nulle part.
mise à jour
dans les situations où vous utilisez une bibliothèque et n'avez aucun contrôle sur l'emplacement du ca-bundle, vous pouvez également définir explicitement l'emplacement du ca-bundle comme étant votre ca-bundle à l'échelle de l'hôte:
la source
verify
chemin.Je fais face au même problème en utilisant gspread et ces commandes fonctionnent pour moi:
la source
Si vous souhaitez supprimer les avertissements, utilisez le code ci-dessous.
et
verify=False
avecrequest.get
oupost
méthodela source
J'ai trouvé une approche spécifique pour résoudre un problème similaire. L'idée pointe le fichier cacert stocké sur le système et utilisé par d'autres applications basées sur SSL.
Dans Debian (je ne suis pas sûr qu'il en soit de même dans les autres distributions), les fichiers de certificat (.pem) sont stockés sur
/etc/ssl/certs/
So, voici le code qui fonctionne pour moi:Pour deviner quel
pem
fichier choisir, je dois parcourir l'URL et vérifier quelle autorité de certification (CA) a généré le certificat.MODIFIER: si vous ne pouvez pas modifier le code (parce que vous exécutez une troisième application), vous pouvez essayer d'ajouter
pem
directement le certificat/usr/local/lib/python2.7/dist-packages/requests/cacert.pem
(par exemple en le copiant à la fin du fichier).la source
/usr/local/lib/python2.7/dist-packages/requests/cacert.pem
par un lien symbolique vers le magasin OS?Si vous ne vous souciez pas du certificat, utilisez-le
verify=False
.la source
Après des heures de débogage, je ne pouvais que faire fonctionner cela en utilisant les packages suivants:
en utilisant
OpenSSL 1.0.2g 1 Mar 2016
Sans ces forfaits
verify=False
ne fonctionnait pas.J'espère que ça aidera quelqu'un.
la source
J'ai rencontré le même problème. Il s'avère que je n'avais pas installé le certificat intermédiaire sur mon serveur (il suffit de l'ajouter au bas de votre certificat comme indiqué ci-dessous).
https://www.digicert.com/ssl-support/pem-ssl-creation.htm
Assurez-vous que le package ca-certificats est installé:
La mise à jour de l'heure peut également résoudre ce problème:
Si vous utilisez un certificat auto-signé, vous devrez probablement l'ajouter manuellement à votre système.
la source
Si les appels de requête sont enfouis quelque part au fond du code et que vous ne souhaitez pas installer le certificat de serveur, alors, uniquement à des fins de débogage , il est possible de monkeypatch les requêtes:
Ne jamais utiliser en production!
la source
Trop tard pour la fête, je suppose, mais je voulais coller le correctif pour les autres errants comme moi! Donc, ce qui suit a fonctionné pour moi sur Python 3.7.x
Tapez ce qui suit dans votre terminal
Essayez d'exécuter à nouveau votre script / vos requêtes et voyez si cela fonctionne (je suis sûr qu'il ne sera pas encore résolu!). Si cela ne fonctionne pas, essayez d'exécuter la commande suivante directement dans le terminal
la source
J'ai combattu ce problème pendant des heures.
J'ai essayé de mettre à jour les demandes. Ensuite, j'ai mis à jour le certifi. J'ai pointé la vérification vers certifi.where () (le code le fait de toute façon par défaut). Rien n'a fonctionné.
Enfin, j'ai mis à jour ma version de python en python 2.7.11. J'étais sur Python 2.7.5 qui avait quelques incompatibilités avec la façon dont les certificats sont vérifiés. Une fois que j'ai mis à jour Python (et une poignée d'autres dépendances), il a commencé à fonctionner.
la source
Ceci est similaire à la réponse de @ rafael-almeida, mais je tiens à souligner qu'à partir des demandes 2.11+, il n'y a pas 3 valeurs qui
verify
peuvent prendre, il y en a en fait 4:True
: valide par rapport aux autorités de certification internes de confiance des demandes.False
: contourne complètement la validation du certificat . (Non recommandé)Le reste de ma réponse concerne le # 4, comment utiliser un répertoire contenant des certificats pour valider:
Obtenez les certificats publics nécessaires et placez-les dans un répertoire.
À strictement parler, vous "devriez" probablement utiliser une méthode hors bande pour obtenir les certificats, mais vous pouvez également les télécharger à l'aide de n'importe quel navigateur.
Si le serveur utilise une chaîne de certificats, assurez-vous d'obtenir chaque certificat unique de la chaîne.
Selon la documentation des demandes, le répertoire contenant les certificats doit d'abord être traité avec l'utilitaire "rehash" (
openssl rehash
).(Cela nécessite openssl 1.1.1+, et toutes les implémentations de Windows openssl ne prennent pas en charge rehash. Si
openssl rehash
cela ne fonctionne pas pour vous, vous pouvez essayer d'exécuter le script rehash ruby sur https://github.com/ruby/openssl/blob/master /sample/c_rehash.rb , même si je n'ai pas essayé cela.)J'ai eu du mal à recevoir des demandes de reconnaissance de mes certificats, mais après avoir utilisé le
openssl x509 -outform PEM
commande pour convertir les certificats en Base64.pem
format , tout a parfaitement fonctionné.Vous pouvez également faire un ré-hachage paresseux:
la source
Il y a actuellement un problème dans le module des demandes à l'origine de cette erreur, présent dans les versions v2.6.2 à v2.12.4 (ATOW): https://github.com/kennethreitz/requests/issues/2573
La solution de contournement pour ce problème consiste à ajouter la ligne suivante:
requests.packages.urllib3.util.ssl_.DEFAULT_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'
la source
Comme mentionné par @Rafael Almeida, le problème que vous rencontrez est causé par un certificat SSL non fiable. Dans mon cas, le certificat SSL n'était pas approuvé par mon serveur. Pour contourner cela sans compromettre la sécurité, j'ai téléchargé le certificat et l' ai installé sur le serveur (en double-cliquant simplement sur le fichier .crt puis sur Installer le certificat ...).
la source
Il n'est pas possible d'ajouter des options si des demandes sont appelées à partir d'un autre package. Dans ce cas, l'ajout de certificats au paquet cacert est la voie à suivre, par exemple, j'ai dû ajouter "StartCom Class 1 Primary Intermediate Server CA", pour lequel j'ai téléchargé le certificat racine dans StartComClass1.pem. étant donné que mon virtualenv s'appelle caldav, j'ai ajouté le certificat avec:
une de celles-ci pourrait suffire, je n'ai pas vérifié
la source
J'avais un problème de validation de certification similaire ou identique. J'ai lu que les versions d'OpenSSL inférieures à 1.0.2, dont les requêtes dépendent, ont parfois du mal à valider des certificats forts (voir ici ). CentOS 7 semble utiliser 1.0.1e qui semble avoir le problème.
Je ne savais pas comment contourner ce problème sur CentOS, j'ai donc décidé d'autoriser des certificats CA 1024 bits plus faibles.
la source
J'ai dû passer de Python 3.4.0 à 3.4.6
la source
Dans mon cas, la raison était assez banale.
Je savais que la vérification SSL avait fonctionné jusqu'à quelques jours plus tôt et était en fait un travail sur une autre machine.
Ma prochaine étape consistait à comparer le contenu et la taille du certificat entre la machine sur laquelle la vérification fonctionnait et celle sur laquelle elle ne l'était pas.
Cela m'a rapidement conduit à déterminer que le certificat sur la machine fonctionnant «incorrectement» n'était pas bon, et une fois que je l'ai remplacé par le «bon» certificat, tout allait bien.
la source