Python SSL客户端/服务器中自动输入密码短语

5 投票
3 回答
14665 浏览
提问于 2025-04-15 22:22

我需要创建一个客户端/服务器应用程序,用于将文件从客户端发送到服务器。为此,我使用简单的SSL套接字,并通过证书进行身份验证。

 
ms = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_sock = ssl.wrap_socket(ms,
                           keyfile=".../newCA/my_client.key",
                           certfile=".../newCA/my_client.crt",
                           server_side=0,
                           cert_reqs=ssl.CERT_REQUIRED,
                           ca_certs=".../newCA/CA/my-ca.crt"
                           )
ssl_sock.connect((HOST, MPORT))

服务器端的代码如下:


msock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.ssl_sock = ssl.wrap_socket(msock,
                           keyfile=".../newCA/my_server.key",
                           certfile=".../newCA/my_server.crt",
                           server_side=1,
                           cert_reqs=ssl.CERT_REQUIRED,
                           ca_certs=".../newCA/CA/my-ca.crt"
                           )
        self.ssl_sock.bind(('', self.PORT))
        self.ssl_sock.listen(self.QUEUE_MAX)

现在问题来了:当客户端尝试连接到服务器时,它需要输入私钥的密码,这在服务器端和客户端都是如此。

  • 在Java中,我们需要设置一个系统属性:javax.net.ssl.keyStorePassword="",这样它就能自动使用。但是在Python中,这个密码是怎么用的呢?我不能每次客户端连接时都输入密码。

问题是我的应用程序:客户端应该使用已经签名的证书,服务器也应该使用已经签名的证书。我不能更改这一点。服务器和客户端都是长期运行的应用程序,所以我们只需要启动它们,不用再去关注它们。但是,正如我所理解的,Python没有提供标准的方法来自动输入私钥的密码。有没有其他的建议呢?

3 个回答

1

这里有一个我找到的解决方案,灵感来自于这篇文章:
使用密码保护的客户端证书创建Python请求会话

import ssl
import requests
from requests.adapters import HTTPAdapter

class SSLAdapter(HTTPAdapter):

    def init_poolmanager(self, *args, **kwargs):
        context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
        context.load_cert_chain(certfile='my_certificate.crt',
                                password='my_passphrase')
        kwargs['ssl_context'] = context
        return super().init_poolmanager(*args, **kwargs)

session = requests.session()
session.mount('https://my_protected_site.com', SSLAdapter())
5

你可以参考一下这个链接:Python中的SSLSocket密码/口令。在服务器的情况下,去掉私钥文件的密码是可以的。OpenSSL提供了一些工具来实现这个功能。

比如,你可以使用以下命令:

openssl pkey -in yourkey-with-pass.pem -out yourkey-without-pass.pem

3

一个密码短语是为了让人输入,以便进行身份识别。如果你想把它写死在代码里,那么没有密码短语的SSL密钥能提供同样的安全性。想要去掉密码短语,可以参考这个链接:https://web.archive.org/web/20090116084124/http://www.aleph-null.tv/article/20080714-1337-917.xml/Apache,-SSL,-and-&quot%3BGetting-Rid-of-the-Passphrase&quot%3B

撰写回答