Requests: Erreur SSL : mauvaise prise de contact

Créé le 20 mai 2016  ·  33Commentaires  ·  Source: psf/requests

Je n'ai pas pu utiliser votre bibliothèque dans CeontOS 7 avec Python 2.7.5. J'ai cette erreur :

File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 576, in send
    r = adapter.send(request, **kwargs)
  File "/usr/lib/python2.7/site-packages/requests/adapters.py", line 447, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'SSL3_GET_SERVER_CERTIFICATE', 'certificate verify failed')],)",)

La mise à jour de Python ou de toute bibliothèque SSL n'a pas aidé. J'ai cette erreur dans CentOS et Ubuntu, dans Arch Linux tout fonctionne bien.

Needs More Information

Commentaire le plus utile

Aha, ok, nous y sommes arrivés.

api.smartsheet.com sert son TLS en utilisant ce qu'on appelle un "certificat à signature croisée". Cela a été utilisé car Verisign, l'autorité de certification de api.smartsheet.com , utilisait à l'origine un certificat racine de 1024 bits. Ceux-ci ont été dépréciés et remplacés par des certificats racine plus forts, mais certains navigateurs et systèmes plus anciens peuvent ne pas avoir reçu de mises à jour, donc des sites comme api.smartsheet.com servent un certificat racine qui est signé par la racine 1024 bits.

Ce n'est normalement pas un problème, _sauf_ :

  • certifi supprimé les racines faibles de 1024 bits
  • OpenSSL antérieur à 1.0.2 ne réussit pas à créer des chaînes de certification et ne parvient donc pas à valider correctement la racine à signature croisée.

Vous pouvez résoudre ce problème de deux manières. Le premier moyen, meilleur mais plus drastique, consiste à mettre à niveau votre OpenSSL vers la 1.0.2 ou une version ultérieure. C'est difficile à faire sur Centos, j'en ai peur. Le moyen le moins bon mais le plus efficace consiste à obtenir la sortie de l'exécution de python -c "import certifi; print certifi.old_where()" , puis à définir la variable d'environnement REQUESTS_CA_BUNDLE sur le chemin imprimé.

Tous les 33 commentaires

Pourriez-vous s'il vous plaît nous dire comment vous avez installé les requêtes et quelle version vous avez installée ?

Il s'agit presque certainement d'un problème SNI, donc selon la façon dont la bibliothèque a été installée, nous devrons peut-être ajouter des dépendances facultatives.

request a été installé en tant que dépendance pour smartsheet-python-sdk via pip :

pip show requests
---
Metadata-Version: 2.0
Name: requests
Version: 2.10.0
Summary: Python HTTP for Humans.
Home-page: http://python-requests.org
Author: Kenneth Reitz
Author-email: [email protected]
Installer: pip
License: Apache 2.0
Location: /usr/lib/python3.4/site-packages
Requires: 
Classifiers:
  Development Status :: 5 - Production/Stable
  Intended Audience :: Developers
  Natural Language :: English
  License :: OSI Approved :: Apache Software License
  Programming Language :: Python
  Programming Language :: Python :: 2.6
  Programming Language :: Python :: 2.7
  Programming Language :: Python :: 3
  Programming Language :: Python :: 3.3
  Programming Language :: Python :: 3.4
  Programming Language :: Python :: 3.5
  Programming Language :: Python :: Implementation :: CPython
  Programming Language :: Python :: Implementation :: PyPy

pip show smartsheet-python-sdk
---
Metadata-Version: 2.0
Name: smartsheet-python-sdk
Version: 1.0.1
Summary: Library that uses Python to connect to Smartsheet services (using API 2.0).
Home-page: http://smartsheet-platform.github.io/api-docs/
Author: Smartsheet
Author-email: [email protected]
Installer: pip
License: Apache-2.0
Location: /usr/lib/python3.4/site-packages
Requires: certifi, requests, six, python-dateutil, requests-toolbelt
Classifiers:
  Development Status :: 5 - Production/Stable
  Intended Audience :: Developers
  Natural Language :: English
  Operating System :: OS Independent
  License :: OSI Approved :: Apache Software License
  Programming Language :: Python
  Programming Language :: Python :: 2.7
  Programming Language :: Python :: 3.3
  Programming Language :: Python :: 3.4
  Programming Language :: Python :: 3.5
  Programming Language :: Python :: Implementation :: PyPy
  Programming Language :: Python :: Implementation :: CPython
  Topic :: Software Development :: Libraries :: Python Modules
  Topic :: Office/Business :: Financial :: Spreadsheet

Le paquet supprimé dans pip et l'installation à partir de yum n'aideront pas ...

@pensnarik Pouvez-vous essayer d'exécuter pip install -U requests[security] dans votre environnement, puis réessayer ?

Merci, Lukasa, pour tes conseils, mais ça n'a pas aidé...

[mutex<strong i="6">@unica1</strong> parser]$ sudo pip install -U requests[security]
[sudo] password for mutex: 
Collecting requests[security]
  Using cached requests-2.10.0-py2.py3-none-any.whl
Collecting pyOpenSSL>=0.13 (from requests[security])
  Using cached pyOpenSSL-16.0.0-py2.py3-none-any.whl
Collecting ndg-httpsclient (from requests[security])
Requirement already up-to-date: pyasn1 in /usr/lib/python2.7/site-packages (from requests[security])
Collecting cryptography>=1.3 (from pyOpenSSL>=0.13->requests[security])
  Using cached cryptography-1.3.2.tar.gz
Requirement already up-to-date: six>=1.5.2 in /usr/lib/python2.7/site-packages (from pyOpenSSL>=0.13->requests[security])
Requirement already up-to-date: idna>=2.0 in /usr/lib/python2.7/site-packages (from cryptography>=1.3->pyOpenSSL>=0.13->requests[security])
Requirement already up-to-date: setuptools>=11.3 in /usr/lib/python2.7/site-packages (from cryptography>=1.3->pyOpenSSL>=0.13->requests[security])
Requirement already up-to-date: enum34 in /usr/lib/python2.7/site-packages (from cryptography>=1.3->pyOpenSSL>=0.13->requests[security])
Requirement already up-to-date: ipaddress in /usr/lib/python2.7/site-packages (from cryptography>=1.3->pyOpenSSL>=0.13->requests[security])
Requirement already up-to-date: cffi>=1.4.1 in /usr/lib64/python2.7/site-packages (from cryptography>=1.3->pyOpenSSL>=0.13->requests[security])
Requirement already up-to-date: pycparser in /usr/lib/python2.7/site-packages (from cffi>=1.4.1->cryptography>=1.3->pyOpenSSL>=0.13->requests[security])
Building wheels for collected packages: cryptography
  Running setup.py bdist_wheel for cryptography ... done
  Stored in directory: /root/.cache/pip/wheels/14/df/02/611097a49d7739151deb68d0172dff5ae7cba01b82769e56ef
Successfully built cryptography
Installing collected packages: cryptography, pyOpenSSL, ndg-httpsclient, requests
  Found existing installation: requests 2.6.0
    DEPRECATION: Uninstalling a distutils installed project (requests) has been deprecated and will be removed in a future version. This is due to the fact that uninstalling a distutils project will only partially uninstall the project.
    Uninstalling requests-2.6.0:
      Successfully uninstalled requests-2.6.0
Successfully installed cryptography-1.3.2 ndg-httpsclient-0.4.0 pyOpenSSL-16.0.0 requests-2.10.0
You are using pip version 8.1.0, however version 8.1.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
[mutex<strong i="7">@unica1</strong> parser]$ ./update_region_price.py 
Traceback (most recent call last):
  File "./update_region_price.py", line 129, in <module>
    sys.exit(app.run(sys.argv))
  File "./update_region_price.py", line 122, in run
    self.update_basic()
  File "./update_region_price.py", line 65, in update_basic
    sheet = self.sm.Sheets.get_sheet(self.sheet_id, page_size=5000)
  File "/usr/lib/python2.7/site-packages/smartsheet/sheets.py", line 460, in get_sheet
    response = self._base.request(prepped_request, expected, _op)
  File "/usr/lib/python2.7/site-packages/smartsheet/smartsheet.py", line 178, in request
    res = self.request_with_retry(prepped_request, operation)
  File "/usr/lib/python2.7/site-packages/smartsheet/smartsheet.py", line 242, in request_with_retry
    return self._request(prepped_request, operation)
  File "/usr/lib/python2.7/site-packages/smartsheet/smartsheet.py", line 208, in _request
    res = self._session.send(prepped_request, stream=stream)
  File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 585, in send
    r = adapter.send(request, **kwargs)
  File "/usr/lib/python2.7/site-packages/requests/adapters.py", line 477, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'SSL3_GET_SERVER_CERTIFICATE', 'certificate verify failed')],)",)

Pouvez-vous me montrer à quel hôte vous vous connectez ?

Lukasa, bien sûr : https://api.smartsheet.com/2.0 , j'utilise python wrapper pour l'API smartsheet (https://github.com/smartsheet-platform/smartsheet-python-sdk).

Et avez-vous certifi installé dans votre environnement ?

Oui j'ai:

[mutex<strong i="6">@unica1</strong> parser]$ pip show certifi
---
Metadata-Version: 2.0
Name: certifi
Version: 2016.2.28
Summary: Python package for providing Mozilla's CA Bundle.
Home-page: http://certifi.io/
Author: Kenneth Reitz
Author-email: [email protected]
Installer: pip
License: ISC
Location: /usr/lib/python2.7/site-packages
Requires: 
Classifiers:
  Development Status :: 5 - Production/Stable
  Intended Audience :: Developers
  Natural Language :: English
  Programming Language :: Python
  Programming Language :: Python :: 2.5
  Programming Language :: Python :: 2.6
  Programming Language :: Python :: 2.7
  Programming Language :: Python :: 3.0
  Programming Language :: Python :: 3.1
  Programming Language :: Python :: 3.2
  Programming Language :: Python :: 3.3
  Programming Language :: Python :: 3.4

Aha, ok, nous y sommes arrivés.

api.smartsheet.com sert son TLS en utilisant ce qu'on appelle un "certificat à signature croisée". Cela a été utilisé car Verisign, l'autorité de certification de api.smartsheet.com , utilisait à l'origine un certificat racine de 1024 bits. Ceux-ci ont été dépréciés et remplacés par des certificats racine plus forts, mais certains navigateurs et systèmes plus anciens peuvent ne pas avoir reçu de mises à jour, donc des sites comme api.smartsheet.com servent un certificat racine qui est signé par la racine 1024 bits.

Ce n'est normalement pas un problème, _sauf_ :

  • certifi supprimé les racines faibles de 1024 bits
  • OpenSSL antérieur à 1.0.2 ne réussit pas à créer des chaînes de certification et ne parvient donc pas à valider correctement la racine à signature croisée.

Vous pouvez résoudre ce problème de deux manières. Le premier moyen, meilleur mais plus drastique, consiste à mettre à niveau votre OpenSSL vers la 1.0.2 ou une version ultérieure. C'est difficile à faire sur Centos, j'en ai peur. Le moyen le moins bon mais le plus efficace consiste à obtenir la sortie de l'exécution de python -c "import certifi; print certifi.old_where()" , puis à définir la variable d'environnement REQUESTS_CA_BUNDLE sur le chemin imprimé.

Argh, le SDK smartsheet remplace cette variable d'environnement en utilisant explicitement certifi.

Nouveau plan. Dès le début de l'importation de smartsheet, avant de faire autre chose, pouvez-vous ajouter les lignes suivantes ?

import smartsheet.session
import certifi
smartsheet.session._TRUSTED_CERT_FILE = certifi.old_where()

Cela devrait, espérons-le, aider. Vous ne devriez pas avoir besoin de la variable d'environnement avec cette approche.

Malheureusement, cela ne fonctionne pas même si je modifie cette ligne dans /usr/lib/python2.7/site-packages/smartsheet/session.py :

_TRUSTED_CERT_FILE = certifi.where()

à

_TRUSTED_CERT_FILE = certifi.old_where()

Quand je change cette var de mon code, ça n'aide pas trop...

À ce stade, je suis assez convaincu qu'il ne s'agit pas d'un bogue dans les demandes et qu'il s'agit en fait d'un problème avec le wrapper de l'API smartsheet. Avez-vous essayé de leur signaler cela?

Hum. Êtes-vous sûr que ce code est en cours d'exécution ? Pouvez-vous utiliser des déclarations imprimées pour confirmer qu'il est utilisé ?

La rétrogradation de certifi de 2015.11.20.1 à 2015.4.28 résout le problème !

ubuntu@ip-172-31-58-148 :~/
ubuntu@ip-172-31-58-148 :~/
Python 2.7.6 (par défaut, 22 juin 2015, 17:58:13)
[GCC 4.8.2] sur linux2
Tapez "aide", "droit d'auteur", "crédits" ou "licence" pour plus d'informations.

demandes d'importation
request.get('https://logo.clearbit.com/beutifi.com')
request/packages/urllib3/util/ssl_.py:318 : SNIMissingWarning : une requête HTTPS a été effectuée, mais l'extension SNI (Subject Name Indication) vers TLS n'est pas disponible sur cette plate-forme. Cela peut amener le serveur à présenter un certificat TLS incorrect, ce qui peut entraîner des échecs de validation. Vous pouvez passer à une version plus récente de Python pour résoudre ce problème. Pour plus d'informations, consultez https://urllib3.readthedocs.org/en/latest/security.html#snimissingwarning.
SNIMissingAvertissement
request/packages/urllib3/util/ssl_.py:122 : InsecurePlatformWarning : un véritable objet SSLContext n'est pas disponible. Cela empêche urllib3 de configurer SSL de manière appropriée et peut entraîner l'échec de certaines connexions SSL. Vous pouvez passer à une version plus récente de Python pour résoudre ce problème. Pour plus d'informations, consultez https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
Avertissement de plate-forme non sécurisée
Traceback (appel le plus récent en dernier) :
Déposer "", ligne 1, dans
Fichier "requests/api.py", ligne 71, dans get
return request('get', url, params=params, *_kwargs)
Fichier "requests/api.py", ligne 57, dans request
return session.request(method=method, url=url, *_kwargs)
Fichier "requests/sessions.py", ligne 477, dans request
resp = self.send(prep, *_send_kwargs)
Fichier "requests/sessions.py", ligne 587, en envoi
r = adapter.send(requête, *_kwargs)
Fichier "requests/adapters.py", ligne 491, en envoi
lever SSLError(e, request=request)
request.exceptions.SSLError: [Errno 1] _ssl.c:510: error:14077410 :SSL routines:SSL23_GET_SERVER_HELLO :échec de la prise de contact d'alerte sslv3

Ceci est ma contribution à ce problème. Cela n'arrive pas à chaque requête https.

@sProject Vous devrez résoudre ces deux avertissements avant que nous puissions déterminer si vous avez un nouveau problème. Si vous avez reçu des demandes de pip, exécutez pip install pyopenssl pyasn1 ndg-httpsclient . Si vous avez reçu des demandes de votre fournisseur de système, vous devez installer ces trois packages à partir de là.

Ce bug semble avoir été résolu il y a plus de deux mois. Si je me trompe dans cette conclusion et qu'il y a toujours un bogue à trouver dans les demandes, je serai heureux de rouvrir ceci.

Merci à tous pour votre collaboration sur les demandes !

L'exemple de pygodaddy lève la même exception

from pygodaddy import GoDaddyClient
client = GoDaddyClient()
if client.login(login[0],login[1]):
    print client.find_domains()
else: print 'falhou'


$ ./dynip.py 
Traceback (most recent call last):
  File "./dynip.py", line 8, in <module>
    if client.login(login[0],login[1]):
  File "/usr/lib/python2.7/site-packages/pygodaddy/client.py", line 99, in login
    r = self.session.get(self.default_url)
  File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 501, in get
    return self.request('GET', url, **kwargs)
  File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 488, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 609, in send
    r = adapter.send(request, **kwargs)
  File "/usr/lib/python2.7/site-packages/requests/adapters.py", line 497, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",)

Le déclassement de @pensnarik ne le

# pip list
Babel (2.3.4)
beautifulsoup4 (4.5.1)
blinker (1.4)
certifi (2016.9.26)
cffi (1.9.1)
chardet (2.3.0)
click (6.6)
cryptography (1.5.3)
cssselect (0.9.2)
decorator (4.0.10)
django-htmlmin (0.9.1)
dnspython (1.14.0)
enum34 (1.1.6)
extras (1.0.0)
first (2.0.1)
fixtures (3.0.0)
Flask (0.11.1)
Flask-Babel (0.11.1)
Flask-Gravatar (0.4.2)
Flask-Login (0.3.2)
Flask-Mail (0.9.1)
Flask-Principal (0.4.0)
Flask-Security (1.7.5)
Flask-SQLAlchemy (2.1)
Flask-WTF (0.12)
gps (3.16)
gssapi (1.2.0)
html5lib (1.0b3)
idna (2.1)
importlib (1.0.4)
iniparse (0.4)
ipaclient (4.3.2)
ipaddress (1.0.17)
ipalib (4.3.2)
ipaplatform (4.3.2)
ipapython (4.3.2)
itsdangerous (0.24)
Jinja2 (2.8)
jwcrypto (0.3.2)
kitchen (1.2.4)
linecache2 (1.0.0)
lockfile (0.12.2)
lxml (3.6.4)
M2Crypto (0.25.1)
MarkupSafe (0.23)
munch (2.0.4)
ndg-httpsclient (0.4.2)
netaddr (0.7.18)
nose (1.3.7)
numpy (1.11.1)
passlib (1.6.5)
pbr (1.10.0)
pif (0.7.3)
Pillow (3.3.1)
pip (8.1.2)
pip-tools (1.7.0)
ply (3.9)
psutil (4.3.0)
psycopg2 (2.6.2)
pwquality (1.3.0)
pyasn1 (0.1.9)
pyasn1-modules (0.0.8)
pycparser (2.17)
pycrypto (2.6.1)
pycurl (7.43.0)
pygobject (3.20.1)
pygodaddy (0.2.2)
pygpgme (0.3)
pyliblzma (0.5.3)
pyOpenSSL (16.2.0)
pyrsistent (0.11.13)
PySocks (1.5.7)
python-dateutil (2.5.3)
python-fedora (0.8.0)
python-ldap (2.4.27)
python-mimeparse (1.5.2)
python-nss (1.0.0)
python-yubico (1.3.2)
pytz (2016.6.1)
pyusb (1.0.0)
pyxattr (0.5.5)
qrcode (5.3)
reportlab (3.3.0)
requests (2.12.1)
requests-file (1.4.1)
rpm-python (4.13.0)
scdate (1.10.9)
setuptools (28.8.0)
simplejson (3.8.2)
six (1.10.0)
slip (0.6.4)
speaklater (1.3)
SQLAlchemy (1.0.14)
sqlparse (0.2.1)
SSSDConfig (1.14.2)
Terminator (0.98)
testscenarios (0.5.0)
testtools (2.2.0)
tldextract (2.0.2)
traceback2 (1.4.0)
typing (3.5.2.2)
uniconvertor (2.0)
unittest2 (1.1.0)
urlgrabber (3.10.1)
urllib3 (1.16)
Werkzeug (0.11.11)
WTForms (2.1)
yum-metadata-parser (1.1.4)

GoDaddy vous propose une chaîne de certificats incomplète. Cela signifie qu'il nous manque l'un des certificats intermédiaires et que nous ne pouvons pas créer de chaîne de confiance. Soit vous devrez ajouter le certificat intermédiaire manquant au magasin de confiance certifi, soit vous devrez contacter GoDaddy et leur dire de régler leur problème.

@Lukasa comment peut-on vérifier si le problème vient des demandes ou de l'émetteur du certificat ?
J'ai un certificat émis par Entrust et mes navigateurs sont tout à fait d'accord avec cela lorsque je navigue vers l'URL.
Mais lorsque j'essaie d'accéder à cette URL via des requêtes, j'ai [SSL: CERTIFICATE_VERIFY_FAILED]

Traçage complet

$ python main.py
Traceback (most recent call last):
  File "/Users/romandodin/venvs/nokdok/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 594, in urlopen
    chunked=chunked)
  File "/Users/romandodin/venvs/nokdok/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 350, in _make_request
    self._validate_conn(conn)
  File "/Users/romandodin/venvs/nokdok/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 835, in _validate_conn
    conn.connect()
  File "/Users/romandodin/venvs/nokdok/lib/python3.5/site-packages/requests/packages/urllib3/connection.py", line 323, in connect
    ssl_context=context)
  File "/Users/romandodin/venvs/nokdok/lib/python3.5/site-packages/requests/packages/urllib3/util/ssl_.py", line 324, in ssl_wrap_socket
    return context.wrap_socket(sock, server_hostname=server_hostname)
  File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 376, in wrap_socket
    _context=self)
  File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 747, in __init__
    self.do_handshake()
  File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 983, in do_handshake
    self._sslobj.do_handshake()
  File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 628, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:645)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/romandodin/venvs/nokdok/lib/python3.5/site-packages/requests/adapters.py", line 423, in send
    timeout=timeout
  File "/Users/romandodin/venvs/nokdok/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 624, in urlopen
    raise SSLError(e)
requests.packages.urllib3.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:645)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "main.py", line 64, in <module>
    r = s.get('https://infoproducts.alcatel-lucent.com/cgi-bin/get_doc_list.pl?entry_id=1-0000000000662&srch_how=&srch_str=&release=&model=&category=&contype=&format=&sortby=&how=all_prod',
  File "/Users/romandodin/venvs/nokdok/lib/python3.5/site-packages/requests/sessions.py", line 501, in get
    return self.request('GET', url, **kwargs)
  File "/Users/romandodin/venvs/nokdok/lib/python3.5/site-packages/requests/sessions.py", line 488, in request
    resp = self.send(prep, **send_kwargs)
  File "/Users/romandodin/venvs/nokdok/lib/python3.5/site-packages/requests/sessions.py", line 609, in send
    r = adapter.send(request, **kwargs)
  File "/Users/romandodin/venvs/nokdok/lib/python3.5/site-packages/requests/adapters.py", line 497, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:645)

paquets installés

$ pip list
certifi (2016.9.26)
pip (9.0.1)
requests (2.12.4)
setuptools (32.3.1)
wheel (0.29.0)

Détails du certificat

Subject infoproducts.alcatel-lucent.com
SAN infoproducts.alcatel-lucent.com
documentation.alcatel-lucent.com
Valid From Thu, 01 Dec 2016 13:15:08 GMT
Valid Until Sat, 01 Dec 2018 13:45:07 GMT
Issuer Entrust Certification Authority - L1K

Le problème ne vient presque certainement pas de l'émetteur, mais de votre serveur. Pouvez-vous me montrer le résultat de l'exécution de openssl s_client -connect "<your-host>:<your-port>" -showcerts -servername "<your-host>" sur votre serveur s'il vous plaît ?

Je ne suis pas sûr d'avoir bien utilisé la commande, mais c'est quelque chose :

$ openssl s_client -connect "infoproducts.alcatel-lucent.com:443" -showcerts -servername "infoproducts.alcatel-lucent.com"
CONNECTED(00000003)
depth=0 /C=US/ST=Illinois/L=Naperville/O=Alcatel-Lucent USA Inc./CN=infoproducts.alcatel-lucent.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 /C=US/ST=Illinois/L=Naperville/O=Alcatel-Lucent USA Inc./CN=infoproducts.alcatel-lucent.com
verify error:num=27:certificate not trusted
verify return:1
depth=0 /C=US/ST=Illinois/L=Naperville/O=Alcatel-Lucent USA Inc./CN=infoproducts.alcatel-lucent.com
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
 0 s:/C=US/ST=Illinois/L=Naperville/O=Alcatel-Lucent USA Inc./CN=infoproducts.alcatel-lucent.com
   i:/C=US/O=Entrust, Inc./OU=See www.entrust.net/legal-terms/OU=(c) 2012 Entrust, Inc. - for authorized use only/CN=Entrust Certification Authority - L1K
-----BEGIN CERTIFICATE-----
MIIFeDCCBGCgAwIBAgIRAO3KTvH+nKgrAAAAAFDanDYwDQYJKoZIhvcNAQELBQAw
gboxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL
Ex9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg
MjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxLjAs
BgNVBAMTJUVudHJ1c3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBMMUswHhcN
MTYxMjAxMTMxNTA4WhcNMTgxMjAxMTM0NTA3WjCBgTELMAkGA1UEBhMCVVMxETAP
BgNVBAgTCElsbGlub2lzMRMwEQYDVQQHEwpOYXBlcnZpbGxlMSAwHgYDVQQKExdB
bGNhdGVsLUx1Y2VudCBVU0EgSW5jLjEoMCYGA1UEAxMfaW5mb3Byb2R1Y3RzLmFs
Y2F0ZWwtbHVjZW50LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
AK23xiJ/GCWNJa8Oa6SAYwT7QTmIJOXGrfLLZM9ZWDK81SVLm5xUAVRYaYmb3t/U
KpzeUoL+cJIa2xJGdbj50ehUTbB3SOXW7dxr15fuWahSChqaNkI/NClNAxy2Vho5
HxEtsjmuoJ0cNRcZLHZndLtWi27js3ivGxFxUcl7O3rGGj9yb+XXwJvEOsITPfZ/
gpURnHfAurZrw1+xpsArQVOF6+K6KkPnjGoCj0XCyU3LnWc6akcwwwV+HXcW8H5G
/CPvcm3DpI+45v/P2vVJ9+LiEJVHngVYK2QQ8fMDrvS2vs563I4PLnnRds0eOJph
LfHmn87oSW5jCP3RnsW0czECAwEAAaOCAa4wggGqMA4GA1UdDwEB/wQEAwIFoDAT
BgNVHSUEDDAKBggrBgEFBQcDATAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8vY3Js
LmVudHJ1c3QubmV0L2xldmVsMWsuY3JsMEsGA1UdIAREMEIwNgYKYIZIAYb6bAoB
BTAoMCYGCCsGAQUFBwIBFhpodHRwOi8vd3d3LmVudHJ1c3QubmV0L3JwYTAIBgZn
gQwBAgIwaAYIKwYBBQUHAQEEXDBaMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5l
bnRydXN0Lm5ldDAzBggrBgEFBQcwAoYnaHR0cDovL2FpYS5lbnRydXN0Lm5ldC9s
MWstY2hhaW4yNTYuY2VyMEwGA1UdEQRFMEOCH2luZm9wcm9kdWN0cy5hbGNhdGVs
LWx1Y2VudC5jb22CIGRvY3VtZW50YXRpb24uYWxjYXRlbC1sdWNlbnQuY29tMB8G
A1UdIwQYMBaAFIKicHTdvFM/z3vU981/p2DGCky/MB0GA1UdDgQWBBT9w+iH+fpG
UJ0IMw1vVpn+91hk6jAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQAgOcDq
0YsihBWAxA4WFIGkdB/JdOKLRQ0Hvc7KStgtdkB1AqkUv7oBnDCHesazw4vyWbjv
w7dBTtB95jq1ZHX6eHyUDUo2xBmjnaeb2lSAdVV6j10sl7lMfRQh7ba1Im0ibhfe
7gvBn0tUlmdGqqvDqokzV4lVX74Z9nKKKr5D9e3vJsb5AvbDC/eYguBK9Oy8EDa2
ZcuPve3mB68lVy5UDg21RVZE072qC0FlYhNasZlMVUUg7tgDMlynQeeoxHe7Rcic
pHANQxJqtN8/bsE2mO/ryRZALyC7mWeDvG522ZXMaKslwTUr+jokpyUF7tS786Pi
n4zJ/KNZK2suVwcK
-----END CERTIFICATE-----
---
Server certificate
subject=/C=US/ST=Illinois/L=Naperville/O=Alcatel-Lucent USA Inc./CN=infoproducts.alcatel-lucent.com
issuer=/C=US/O=Entrust, Inc./OU=See www.entrust.net/legal-terms/OU=(c) 2012 Entrust, Inc. - for authorized use only/CN=Entrust Certification Authority - L1K
---
No client certificate CA names sent
---
SSL handshake has read 1556 bytes and written 466 bytes
---
New, TLSv1/SSLv3, Cipher is AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : AES256-SHA
    Session-ID: 48D3C9611E37C997182C4F123E21BCFD909D8D4BE887B44355866B80D44E1163
    Session-ID-ctx:
    Master-Key: 0A4A9E2A10E33EAA248541C39AC71F2F879310BAE141A4EA26F425D56C27099FB6D6572C2CCFC763FC743ECF99DABB5B
    Key-Arg   : None
    Start Time: 1483448892
    Timeout   : 300 (sec)
    Verify return code: 21 (unable to verify the first certificate)
---
closed

Oui, donc le serveur a tort.

C'est un problème très courant avec TLS. Une validation de certificat TLS est effectuée en créant d'abord une chaîne de certificats qui nous emmène d'un certificat pour lequel le serveur peut prouver qu'il possède la clé privée (la "feuille") à un certificat en lequel nous avons confiance (la "racine"). Pour OpenSSL, il existe une règle supplémentaire : la racine doit être auto-signé.

Dans la plupart des cas, cette chaîne compte plus de deux étapes : c'est-à-dire que la feuille n'est pas signée par la racine, mais est plutôt signée par un certificat dit intermédiaire . Cet intermédiaire peut lui-même être signé par la racine, mais peut également être signé par d' autres intermédiaires, jusqu'à ce que nous atteignions finalement un intermédiaire signé par une racine.

Par exemple, pour https://python-hyper.org , la chaîne est la suivante :

  1. python-hyper.org, la "feuille", que j'ai demandée et délivrée
  2. Let's Encrypt Authority X3, un certificat intermédiaire utilisé par le projet Let's Encrypt
  3. DST Root CA X3, le certificat racine auquel mon navigateur Web (et mes requêtes) fait confiance

La chaîne correcte pour le site auquel vous accédez doit être :

  1. infoproducts.alcatel-lucent.com, la feuille
  2. Entrust Certification Authority - L1K, le certificat intermédiaire qui a délivré la feuille
  3. Entrust Root Certification Authority - G2, le certificat racine qui a émis l'intermédiaire

Pour votre cas d'utilisation, Requests est livré avec le certificat numéro 3 dans sa base de données de confiance en tant que racine de confiance. Cependant, votre serveur n'envoie que le certificat numéro 1. Les demandes ne peuvent pas passer du certificat 1 au certificat 3 sans avoir le certificat 2, et le serveur ne l'envoie pas. La plupart des navigateurs sont livrés avec des certificats intermédiaires couramment utilisés, ou peuvent en conserver des caches, mais Requests ne peut pas le faire, il n'a donc aucun moyen d'obtenir le certificat 2. Sans certificat 2, la validation doit échouer.

Des serveurs TLS correctement configurés envoient le certificat feuille et tous les intermédiaires nécessaires . Il s'agit de s'assurer que les clients qui n'ont jamais vu les intermédiaires et qui ne peuvent pas les récupérer dynamiquement sont toujours en mesure de valider la chaîne. A titre de comparaison, vérifiez la sortie d'une commande comme la vôtre exécutée contre python-hyper.org :

% openssl s_client -connect python-hyper.org:443 -showcerts -servername "python-hyper.org"
CONNECTED(00000003)
depth=1 /C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
 0 s:/CN=python-hyper.org
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
-----BEGIN CERTIFICATE-----
MIIFBDCCA+ygAwIBAgISAwji03rFoFMPZnEC0rLc7jg3MA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xNzAxMDExMjA4MDBaFw0x
NzA0MDExMjA4MDBaMBsxGTAXBgNVBAMTEHB5dGhvbi1oeXBlci5vcmcwggEiMA0G
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCjF6VMEOe2qHsdbAnYstunDCW5/fBx
yhzNAxSqZKA5qfATdvhDmiPFnHJkQgUkUeGDwbBwemxuUFUaGZKTJDRhlrymLSkN
hkcouBzs/mxDjNlKacokJBm3hpu+oxYohhxPIZBs8NM4olUPDSG68r6sd1EwR+Ia
Lw//nRsMpcrGNmYy+howiBvV3CbuYsbgB59bJ+5y6G2ZqeHMwzFZ+No1oQmBck9T
KAvCh5TteQphzcM9s9NZiB6Z9C0s+vBPKOc1uLssCI3hfr29Af203CX2xgyBjXH7
M4WS17o1zLgs3Q2V03gQ7AmhtgjuJ+2NRf/d6Bsmk8ZhGnyyf+qbY+G/AgMBAAGj
ggIRMIICDTAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsG
AQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFMD50AC8wul1eNKkGVxaAvXb
DSkDMB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/zqOyhMHAGCCsGAQUFBwEB
BGQwYjAvBggrBgEFBQcwAYYjaHR0cDovL29jc3AuaW50LXgzLmxldHNlbmNyeXB0
Lm9yZy8wLwYIKwYBBQUHMAKGI2h0dHA6Ly9jZXJ0LmludC14My5sZXRzZW5jcnlw
dC5vcmcvMBsGA1UdEQQUMBKCEHB5dGhvbi1oeXBlci5vcmcwgf4GA1UdIASB9jCB
8zAIBgZngQwBAgEwgeYGCysGAQQBgt8TAQEBMIHWMCYGCCsGAQUFBwIBFhpodHRw
Oi8vY3BzLmxldHNlbmNyeXB0Lm9yZzCBqwYIKwYBBQUHAgIwgZ4MgZtUaGlzIENl
cnRpZmljYXRlIG1heSBvbmx5IGJlIHJlbGllZCB1cG9uIGJ5IFJlbHlpbmcgUGFy
dGllcyBhbmQgb25seSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIENlcnRpZmljYXRl
IFBvbGljeSBmb3VuZCBhdCBodHRwczovL2xldHNlbmNyeXB0Lm9yZy9yZXBvc2l0
b3J5LzANBgkqhkiG9w0BAQsFAAOCAQEAgX00tBHyz9GiDQjw+Id7sbT1lrtHrmtR
DB+kofnq9pkwIExDXT0bAZ14EnU6atiVqhF3j3KxvxIfbNvmSr7emmhPwt+KqOf7
/1m+gxg3ode9LIg6oLtVOfulecxkS4/Wj990O40vuRNdy4XT4PSNze8iuJtGALoS
U9kP8G/V6VnrdbTYhSIIUW9nm0XQcOUbvupFWtiwE8vZw4t0pQloeECdMuALgVO/
1xSu0kqZgidLOkFwei/xqItx7foREzVvq3kUHD1OAuPI1azHQjErQC3N12OmxmBU
3KDOsaJC2Uu8fqI/y1YOkO97hpsgFZX4BiQNaNhtyy7sscD/teVhWQ==
-----END CERTIFICATE-----
 1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3
-----BEGIN CERTIFICATE-----
MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow
SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT
GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF
q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8
SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0
Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA
a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj
/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T
AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG
CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv
bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k
c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw
VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC
ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz
MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu
Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF
AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo
uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/
wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu
X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG
PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6
KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=python-hyper.org
issuer=/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
---
No client certificate CA names sent
---
SSL handshake has read 2638 bytes and written 451 bytes
---
New, TLSv1/SSLv3, Cipher is AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : AES256-SHA
    Session-ID: BBDF2CA65B2142C1F0C416B28C4FDF8FD5118ED4D5FF8802789D0B54C6309469
    Session-ID-ctx: 
    Master-Key: BD9B8B97EC439248CC5849EBF4B2ED18E0A73472EB8D86FE6F038C4E6944AFD8A163D80D47A3A3B28A6237A44C1B31CE
    Key-Arg   : None
    Start Time: 1483447980
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

Notez que le serveur a envoyé deux certificats dans mon cas, alors que dans le vôtre il n'en a envoyé qu'un.

C'est l'erreur. Veuillez reconfigurer votre serveur pour envoyer tous les intermédiaires pertinents ainsi que la feuille.

Pendant que j'y suis, je dois noter que l'exécution de Qualys SSL Labs sur votre serveur vous aurait également signalé ce problème. =)

Merci @Lukasa pour cette réponse éducative que vous avez donnée ! J'apprécie vraiment et désolé d'avoir troublé cela, c'était mon TLS-knowledge-gap =) La plupart du temps, je suis allé aux problèmes parce que tout était bon dans les navigateurs et ne fonctionnait pas dans les demandes. Mais maintenant, il est clair pour moi quelle est la cause première.

Je crois qu'il n'y a pas de solution de contournement (télécharger le certificat intermédiaire à l'avance) pour ce cas, mais reconfigurer le serveur ? Pour le moment, je vais sauter les contrôles de vérification

@hellt Pas besoin de s'excuser: c'est une chose extrêmement peu évidente et c'est une erreur très courante à faire, donc vous êtes en bonne compagnie ici. =)

Il existe une solution de contournement, en fait. Vous pouvez transmettre un bundle de certificats à verify pour remplacer l'utilisation du bundle de certifi. Ce bundle peut, en plus des certificats racine, contenir des certificats intermédiaires qui deviennent disponibles pour OpenSSL à utiliser pour construire la chaîne. En conséquence, ce que vous pouvez faire est de prendre la chaîne de certificats certifi (qui se trouve dans un fichier que vous pouvez trouver en exécutant python -c 'import certifi; print(certifi.where())' , de la copier ailleurs sur votre système de fichiers, puis d'ajouter le certificat intermédiaire au fin de ce fichier. L'intermédiaire doit être au format PEM. Si vous passez ensuite le chemin du nouveau bundle de certificats au verify kwarg, vous constaterez que tout commence à fonctionner.

Louka,
Que faire si j'obtiens ce type d'erreur ?
certificat d'installation de pip
Certificat de collecte
Impossible de récupérer l'URL https://pypi.python.org/simple/certifi/ : Il y a eu un problème lors de la confirmation du certificat SSL : [Errno 2] Aucun fichier ou répertoire de ce type - ignoré
Impossible de trouver une version qui satisfait le certificat d'exigence (à partir des versions : )
Aucune distribution correspondante trouvée pour certifi

Q

Il semble que vous ayez du mal à valider les certificats TLS de PyPI. Cependant, ce message d'erreur est un peu surprenant. Je ne sais pas tout à fait d'où cela vient, mais cela suggère un problème soit avec la façon dont votre pip est configuré, soit avec votre Python. Rencontrez-vous des erreurs similaires avec d'autres packages python ?

Bonjour à tous,
J'essaie d'effectuer l'authentification Kerberos à l'aide de Python dans l'intranet de mon organisation, mais j'obtiens cette erreur.

demandes d'importation
à partir de request_kerberos importer HTTPKerberosAuth
r = request.get("https: * * * * * ", auth=HTTPKerberosAuth())

SSLError : ("mauvaise poignée de main : Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verification failed')],)",)

Est-ce que quelqu'un sait comment ajouter des certificats pour Python ? Cela aidera-t-il à résoudre ce problème ?

@ajitmuley5 pendant que vous utilisez Requests, des questions telles que les vôtres appartiennent à StackOverflow. Veuillez le poster ici avec le nombre de détails requis. Il y a des gens qui se feront un plaisir de vous aider sans entamer des discussions sur des problèmes anciens et fermés.

@Lukasa Merci ! sudo pip install -U demandes [sécurité] a fonctionné pour moi.

Merci à tous, j'ai des idées !

Cette page vous a été utile?
0 / 5 - 0 notes