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 ответ:
Файл закрытого ключа загружается в модуль 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).