Python httplib.HTTPSConnection和密码

时间:2010-06-24 07:49:05

标签: python ssl https passwords httplib

我将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 个答案:

答案 0 :(得分:4)

私钥文件加载在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包装器)中,但您可以在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)中提供了一个示例。