2010-06-24 6 views
2

J'utilise httplib.HTTPSConnection avec la clé privée:Python httplib.HTTPSConnection et mot de passe

h = httplib.HTTPSConnection(url, key_file='../cert/priv.pem', cert_file='../cert/srv_test.crt') 

Je me demande d'entrer le mot de passe à cette clé privée. Y at-il une option pour entrer un tel mot de passe non pas de l'entrée de l'utilisateur (console) mais d'une autre source (code, environnement)? Peut-être quelque chose comme en Java:

-Djavax.net.ssl.keyStorePassword=my_secret_passwd 
+0

Avez-vous essayé d'intégrer la passe dans l'URL avec la syntaxe typique comme: 'service: // nom d'utilisateur: mot de passe @ nom d'hôte: numéro de port/filepath' ? –

+0

kai1968: ce mot de passe n'est pas pour un site Web, mais protège ma clé privée. –

Répondre

4

Le fichier de clé privée est chargé dans le module _ssl de Python (la partie écrite en C). De _ssl.c, ligne 333:

ret = SSL_CTX_use_PrivateKey_file(self->ctx, key_file, SSL_FILETYPE_PEM); 

Ceci est une fonction OpenSSL qui charge le fichier clé donné. Si un mot de passe est fourni, il appellera une fonction de rappel de mot de passe. Comme cette fonction est par défaut de demander à l'utilisateur, vous devrez le remplacer en utilisant SSL_CTX_set_default_passwd_cb_userdata. Malheureusement, cette fonction n'est pas incluse dans la bibliothèque standard ou M2Crypto (wrapper Python OpenSSL), mais vous pouvez le trouver dans pyopenssl.

Afin de créer une socket à partir d'un fichier de clé protégé par mot, vous devez faire quelque chose comme:

from OpenSSL import SSL 
ctx = SSL.Context(SSL.SSLv23_METHOD) 
ctx.set_passwd_cb(lambda *unused: "yourpassword") 
ctx.use_privatekey_file(keyFilename) 
ctx.use_certificate_file(certFilename) 
someSocket = SSL.Connection(ctx, socket.socket()) 

Création d'une connexion HTTPS est un peu plus difficile et je ne sais pas comment faire avec pyopenssl, mais il y a un exemple fourni dans le code source de pyopenssl (test_ssl.py:242).

+0

Merci! J'ai changé mon client de 'httplib.HTTPSConnection' en client socket simple avec le support SSL et ça marche! –