Python httplib.HTTPSСоединение и пароль - PullRequest
2 голосов
/ 24 июня 2010

Я использую httplib.HTTPSConnection с закрытым ключом:

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

Затем меня просят ввести пароль к этому секретному ключу. Можно ли ввести такой пароль не из пользовательского ввода (консоли), а из другого источника (код, среда)? Может быть, что-то вроде в Java:

-Djavax.net.ssl.keyStorePassword=my_secret_passwd

1 Ответ

4 голосов
/ 24 июня 2010

Файл закрытого ключа загружается в модуль _ssl Python (часть, написанная на C). От _ssl.c, строка 333:

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

Это функция OpenSSL, которая загружает данный файл ключа. Если указан пароль, он вызовет функцию обратного вызова пароля. Поскольку эта функция по умолчанию запрашивает пользователя, вам придется переопределить ее, используя SSL_CTX_set_default_passwd_cb_userdata. К сожалению, эта функция не включена в стандартную библиотеку или M2Crypto (оболочку Python OpenSSL), но вы можете найти ее в pyopenssl .

Чтобы создать сокет из файла ключа, защищенного паролем, вам нужно сделать что-то вроде:

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())

Создание HTTPS-соединения немного сложнее, и я не знаю, как это сделать с pyopenssl, но в исходном коде pyopenssl есть пример (test_ssl.py:242).

...