Python ssl客户端自动输入密码短语/

2024-04-24 08:15:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要创建客户机/服务器应用程序来将文件从客户机发送到服务器。 为此,我使用简单的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中是如何使用的?我不能在客户端连接时一直输入密码短语。

问题是我的应用程序:客户端应该使用已签名的证书,服务器也应该使用已签名的证书。我不能改变它。Serever和客户机都是长寿命的应用程序,所以我们只运行它,不需要寻找它们。但是,据我所知,Python不提供statndard方法来自动为私钥输入密码短语。可能还有其他建议?


Tags: self服务器密码客户端ssl客户机servermy
3条回答

你也可以参考SSLSocket passphrase/password in Python。删除服务器端案例的私钥文件的密码短语是有效的。OpenSSL提供了这样做的实用程序。 例如:

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

以下是我从这篇文章中获得灵感后找到的解决方案:
Creating a Python requests session using a passphrase protected Client side Cert

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

通行短语是指由人输入作为识别的手段。如果要硬编码,则不带密码短语的SSL密钥提供相同级别的安全性。 要删除密码短语,请参见:http://aleph-null.tv/article/20080714-1337-917.xml/Apache,-SSL,-and-&quot%3BGetting-Rid-of-the-Passphrase&quot%3B

相关问题 更多 >