Python httplib.HTTPSConnection与密码

2 投票
1 回答
4762 浏览
提问于 2025-04-16 00:22

我在使用 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

私钥文件是在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中找到它。

为了从一个需要密码的密钥文件创建一个socket,你需要做类似下面的事情:

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

撰写回答