我需要创建客户端/服务器应用程序以将文件从客户端发送到服务器。 我使用简单的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)
问题如下:当客户端尝试连接到服务器时,它需要输入两者的私钥密码:对于服务器端和客户端。
问题是我的Application:Client应该使用已经签名的证书,而Server也应该使用已经签名的证书。我无法改变它。 Serever和客户都是长期应用程序,所以我们只运行它,我们不需要寻找它们。但是,据我所知,Python没有提供自动输入私钥密码的标准方法。可能是其他建议吗?
答案 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-"%3BGetting-Rid-of-the-Passphrase"%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())