Connexion HTTPS à l'aide de Certificat PEM
Je suis en train de POSTER des demandes HTTPS à l'aide d'un PEM certificat comme suit:
import httplib
CERT_FILE = '/path/certif.pem'
conn = httplib.HTTPSConnection('10.10.10.10','443', cert_file =CERT_FILE)
conn.request("POST", "/")
response = conn.getresponse()
print response.status, response.reason
conn.close()
J'ai l'erreur suivante:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/httplib.py", line 914, in request
self._send_request(method, url, body, headers)
File "/usr/lib/python2.6/httplib.py", line 951, in _send_request
self.endheaders()
File "/usr/lib/python2.6/httplib.py", line 908, in endheaders
self._send_output()
File "/usr/lib/python2.6/httplib.py", line 780, in _send_output
self.send(msg)
File "/usr/lib/python2.6/httplib.py", line 739, in send
self.connect()
File "/usr/lib/python2.6/httplib.py", line 1116, in connect
self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file)
File "/usr/lib/python2.6/ssl.py", line 338, in wrap_socket
suppress_ragged_eofs=suppress_ragged_eofs)
File "/usr/lib/python2.6/ssl.py", line 118, in __init__
cert_reqs, ssl_version, ca_certs)
ssl.SSLError: [Errno 336265225] _ssl.c:339: error:140B0009:SSL
routines:**SSL_CTX_use_PrivateKey_file**:PEM lib
Quand j'enlève le cert_file de httplib, j'ai la réponse suivante:
200 ok
Quand j'ajoute l'en-tête d'Authentification (comme conseillé par MattH) avec vide post charge, il fonctionne également.
Cependant, quand j'ai mis la bonne demande avec le Chemin d'accès, le Corps et la Tête, comme la suite (j'ai simplifié eux...)
body = '<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">blablabla</S:Envelope>'
URLprov = "/syncaxis2/services/XXXsyncService"
auth_header = 'Basic %s' % (":".join(["xxx","xxxxx"]).encode('Base64').strip('\r\n'))
conn.request("POST",URLprov,body,{'Authenticate':auth_header})
J'ai 401 non autorisé réponse !
Comme vous pouvez le voir, tout d'abord, je suis invité à fournir le PrivateKey ! pourquoi ai-je besoin de la PrivateKey si je suis un client ? puis, quand j'ai enlever le PrivateKey et le certificat, et de mettre le Chemin d'accès/Corps/en-têtes, j'ai 401 non autorisé d'erreur avec le message WWW-Authenticate: Basic realm="SYNCNB Serveur de Domaine".
Pouvait-on expliquer ce problème? Est-il un autre moyen pour envoyer la demande HTTPS à l'aide d'un certificat en Python?
Vous devez vous connecter pour publier un commentaire.
Voir http://docs.python.org/library/httplib.html
httplib.HTTPSConnection
ne fait pas de vérification du certificat du serveur.La possibilité d'inclure votre certificat privé est lorsque le serveur est en train de faire certificat d'authentification des clients. I. e. le serveur est en train de vérifier le client dispose d'un certificat signé par une autorité de certification qui il a confiance et qu'il est autorisé à accéder à ses ressources.
Si vous ne spécifiez pas le cert argument optionnel, vous devriez être en mesure de se connecter au serveur HTTPS, mais de ne pas valider le certificat du serveur.
Mise à jour
À la suite de votre commentaire que vous avez essayé de l'authentification basique, on dirait que le serveur veut toujours de vous authentifier à l'aide de l'authentification basique. Vos informations ne sont pas valides (avez-vous vérifié de manière indépendante eux?) ou votre
Authenticate
en-tête n'est pas formaté correctement. La modification de votre exemple de code pour inclure une base en-tête d'authentification et un vide post-charge utile:Il semble que vous besoin de quelque chose de semblable à une réponse que j'ai fournie avant d'effectuer simple authentification du certificat client. Voici le code pour la commodité légèrement modifié pour ta question:
getConnection(self, host, timeout=300):
Ce que vous avez à faire est d'essayer de se connecter à un service Web qui requiert une authentification basée sur certificat client.
Êtes-vous sûr vous avez un fichier PEM et pas un fichier PKCS#12? Un fichier PEM ressemble à ça (oui, je sais, j'ai inclus une clé privée...c'est juste un mannequin que j'ai généré pour cet exemple):
Lire cette question.