web-dev-qa-db-fra.com

SSLError ("mauvaise négociation") lors d'une tentative d'accès à des ressources Custom Certificates and Requests

Je souhaite programmer des services Web pour échanger des données en Python avec Zeep. Je ne peux accéder aux services qu'avec mon certificat. J'ai un certificat PFX, mais je l'ai converti en deux fichiers .pem.

Mon code:

from zeep import Client
from zeep.wsse.signature import Signature 
import requests
from requests import Session
key_filename ='/.files/cert.key.pem'
cert_filename = './files/cert.crt.pem'
session = Session()  
r = requests.get('https:...../PingWs?wsdl',
             cert=(cert_filename, key_filename)) 
print (r)

Mais je reçois

soulève SSLError (e, request = request) requests.exceptions.SSLError: HTTPSConnectionPool (Host = 'evidim-test.gov.si', port = 443): Nombre maximal de nouvelles tentatives dépassé avec l'URL:/ws/test/PingWs? wsdl (Causé par SSLError (SSLError ("mauvaise poignée de main: Error ([('Routines SSL', 'certificat_serveur_serveur_tls', 'la vérification du certificat a échoué')],) ",),))

3
lopow

C’est un problème que vous devrez résoudre en mettant en liste blanche le certificat de l’autorité de certification utilisé pour signer le certificat du serveur distant auquel vous essayez de vous connecter à partir de vos paramètres système. Mais à des fins de test uniquement, vous pouvez désactiver la vérification en utilisant:

r = requests.get('https:...../PingWs?wsdl',verify=False)

Ne l'utilisez pas en production.

J'espère que ça aide!

10
sshussain270

Cette erreur signifie presque certainement que le point de terminaison distant n'est pas signé avec un certificat dans votre magasin d'autorités de certification local . Vous avez deux options:

  • Installez le certificat dans le magasin de l'autorité de certification que l'utilisation utilise. Par défaut, il s'agit de votre magasin d'autorités système locales, du moins aussi bien qu'il peut être déterminé par des demandes.

  • Configurez un autre ensemble de certificats à utiliser sur un objet de session de demandes.

Par exemple:

import requests.sessions

photon_requests_session = requests.sessions.Session()
photon_requests_session.verify = "/etc/photon/cacerts.pem"

Ensuite, je dois m'assurer que le certificat de l'autorité de certification du serveur est dans /etc/photon/cacerts.pem.Je l'utilise comme ceci:

r = photon_requests_session.get(url)
1
Sam Hartman