【问题标题】:Python Socket Implementing SSL Certificate [closed]实现 SSL 证书的 Python 套接字 [关闭]
【发布时间】:2021-10-11 15:07:49
【问题描述】:

我正在制作服务器/客户端套接字。
现在我想在服务器上实施 SSL 证书,以便加密连接。
在有人给我文档链接之前,我想说我已经看过了,但我仍然不知道如何实现它。

server.py:https://gist.github.com/comand100vip/19376a249b31ae66f46796749e2b9771
客户端.py:https://gist.github.com/comand100vip/a36f220fe4c0fe0bb1090b9668a79833
我放了链接,因为客户端和服务器加起来是 250 行,我不想要这里的文字墙。

【问题讨论】:

  • “我已经看过了,但我仍然不知道如何实现它。...” - 这是一个非常不具体的问题描述。由于不清楚您不了解什么,因此无法提供解决您特定问题的帮助。 documentation 已经包含示例,如果唯一的反馈是不具体的“不明白这个”,在此重复这些示例是没有意义的

标签: python python-3.x sockets ssl openssl


【解决方案1】:

导入 SSL 并设置上下文。您可以按照自己的意愿实施。例如,您可以将其移至 init 方法。然后将套接字包装在 SSL 上下文中。

import socket, ssl


class Connector:
    HEADER = 1024
    VERSION = "0.1"
    servers_count = 0
    server_alive = True
    shutdown_event = threading.Event()
    servers = []
    FORMAT = "utf-8"
    context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
    context.load_cert_chain('/path/to/certchain.pem', '/path/to/private.key')
    context.verify_mode = ssl.CERT_REQUIRED
    context.check_hostname = True
    context.load_default_certs()

    def __init__(self, port, server_name):
        print("\n[SERVER] Initializing server...")
        self.s = None
        self.HOST = ""  # socket.gethostbyname(socket.gethostname())
        self.PORT = port
        self.server_name = server_name
        self.conn = None
        self.address = None
        self.server_infos = {f"{Connector.servers_count}": f"{self.server_name}", "PORT": f"{self.PORT}", "HOST":
                         f"{self.HOST}"}
        Connector.servers.append(self.server_infos)
        print(f'[SERVER] Created server: "{self.server_name}", index of server: {self.servers_count}')
        Connector.servers_count += 1

 def create_socket(self):
    print(f"[{self.server_name} - INFO] Creating socket...")
    try:
        self.s = socket.socket()
        self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        ssl_sock = context.wrap_socket(self.s,server_hostname=self.HOST)
        ssl_sock.connect((self.address, self.PORT))
        print(f"[{self.server_name} - DONE] Creating socket done!")
    except socket.error as error_msg:
        print(f"[{self.server_name} - ERROR] creating socket:\n{error_msg}")

【讨论】:

  • 如何指定 SSL 证书的路径?客户是否需要任何更改?
  • 这里是文档..查看更新的答案,因为我错过了添加这部分!应该是 load_cert_chain() 方法docs.python.org/3/library/ssl.html
  • 我不完全确定您的流程是如何工作的,但您可能也需要包装您的客户端套接字
  • 但是如何包装客户端套接字?我认为它只需要服务器端的证书。像每个网站一样。
  • 这看起来不像 SSL 服务器。你在哪里调用监听套接字上的accept()
猜你喜欢
  • 2021-01-19
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 2021-10-22
  • 2023-03-17
  • 2017-05-10
  • 2013-04-15
相关资源
最近更新 更多