Python SSL客户端/服务器中自动输入密码短语
我需要创建一个客户端/服务器应用程序,用于将文件从客户端发送到服务器。为此,我使用简单的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-"%3BGetting-Rid-of-the-Passphrase"%3B