Python httplib.HTTPSConnection и пароль


Я использую 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 2

1 ответ:

Файл закрытого ключа загружается в модуль Python _ssl (часть, которая написана на языке 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 wrapper), но вы можете найти ее в 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).