在Python ssl客户端/服务器的情况下自动输入密码短语

时间:2010-05-05 09:24:32

标签: python sockets ssl certificate

我需要创建客户端/服务器应用程序以将文件从客户端发送到服务器。 我使用简单的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中使用它?我无法在客户端连接时输入密码短语。

问题是我的Application:Client应该使用已经签名的证书,而Server也应该使用已经签名的证书。我无法改变它。 Serever和客户都是长期应用程序,所以我们只运行它,我们不需要寻找它们。但是,据我所知,Python没有提供自动输入私钥密码的标准方法。可能是其他建议吗?

3 个答案:

答案 0 :(得分:4)

您也可以参考SSLSocket passphrase/password in Python。删除服务器端案例的私钥文件的密码是有效的。 OpenSSL提供了utils来做到这一点。 例如:

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

答案 1 :(得分:3)

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

答案 2 :(得分:0)

以下是我从本文中获得灵感的解决方案:
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())