如何使用 Python 创建 SSL 套接字服务器

Posted

技术标签:

【中文标题】如何使用 Python 创建 SSL 套接字服务器【英文标题】:How to Create SSL Socket Server With Python 【发布时间】:2021-12-18 11:50:32 【问题描述】:

? 我从一个站点获取了 Ssl 文件,并且想在另一台服务器上使用它们。我可以这样做吗?

我的 SSL 文件:

ca.pem:证书颁发机构包

cert.crt:证书

key.key:私钥

我的服务器 Python 代码:

from socket import *
import hashlib,base64,ssl,datetime

Socket = socket(2,1)
Socket.bind((IP,Port))
Socket.listen()

print("Service Started on "+IP+":"+str(Port))

while True:
    Connection,Address = Socket.accept()
    Secure_Connection = ssl.wrap_socket(Connection, server_side=True, ca_certs="ca.pem", certfile="cert.crt", keyfile="key.key", cert_reqs=ssl.CERT_REQUIRED, ssl_version=ssl.PROTOCOL_TLSv1_2);
    
    # Get certificate from the client
    Client_Cert = Secure_Connection.getpeercert();
    
    CLT_Subject    = dict(item[0] for item in Client_Cert['subject']);
    CLT_Common_Name = CLT_Subject['commonName'];

    # Check the client certificate bears the expected name as per server's policy
    if not Client_Cert:
        raise Exception("Unable to get the certificate from the client");
        
    if CLT_Common_Name != 'DemoClt':
        raise Exception("Incorrect common name in client certificate");

    # Check time validity of the client certificate
    T1  = ssl.cert_time_to_seconds(Client_Cert['notBefore']);
    T2  = ssl.cert_time_to_seconds(Client_Cert['notAfter']);
    TS  = time.time();

    if TS < T1:
        raise Exception("Client certificate not yet active");
        
    if TS > T2:
        raise Exception("Expired client certificate");

    # Send current server time to the client
    Time = "%s"%datetime.datetime.now();
    Secure_Connection.send(Time.encode());
    print("Securely sent %s to %s"%(Time,Address[0]));

    # Close the connection to the client
    Secure_Connection.close();

但我得到了这个 SSL 错误:

Secure_Connection = ssl.wrap_socket(Connection, server_side=True, ca_certs="ca.pem", certfile="cert.crt", keyfile="key.key", cert_reqs=ssl.CERT_REQUIRED, ssl_version=ssl.PROTOCOL_TLSv1_2);
File "C:\Program Files\Python39\lib\ssl.py", line 1405, in wrap_socket
return context.wrap_socket(
File "C:\Program Files\Python39\lib\ssl.py", line 500, in wrap_socket
return self.sslsocket_class._create(
File "C:\Program Files\Python39\lib\ssl.py", line 1040, in _create
self.do_handshake()
File "C:\Program Files\Python39\lib\ssl.py", line 1309, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [SSL: SSLV3_ALERT_CERTIFICATE_UNKNOWN] sslv3 alert certificate unknown (_ssl.c:1129)

这个错误的原因是什么?

【问题讨论】:

【参考方案1】:

此模块基于传输层安全性(通常称为安全套接字层)为网络套接字提供加密和对​​等身份验证功能。 OpenSSL 用于实现该模块。假设平台上安装了 OpenSSL,几乎所有现代 Unix 系统、Windows、macOS 和可能的其他平台。

请注意: 由于使用操作系统套接字 API,某些行为可能与平台相关。安装不同版本的 OpenSSL 也可能会改变行为。一个很好的例子是带有 OpenSSL 版本 1.1.1 的 TLSv1.3。

注意: 该模块在使用前需要仔细阅读。默认 SSL 模块设置可能会给人以错误的安全印象,因为您的应用程序可能不适合这些设置。 它在本节中解释了 SSL 模块中包含的对象和功能。 SSLSocket 是从 socket.socket 派生的,它提供了一个类似套接字的包装器,可以对套接字内的数据进行 SSL 加密和解密。使用 getpeercert() 从连接的另一端获取对等证书,或者使用 cipher() 方法获取用于安全连接的密码。 通过 SSLContext 的 wrap_socket() 方法,复杂的应用程序可以继承 SSL 设置和证书。 SSL.SSLContext 是用于管理 SSL 设置和证书的类之一。 在 3.5.3 版中改进了与 OpenSSL 1.1.0 的链接 OpenSSL 版本 0.9.8、1.0.0 和 1.0.1 已被弃用。将来需要至少安装 OpenSSL 1.0.2 或 1.1.0 才能使 SSL 工作。 3.10 版更新:已实施 PEP 644。 SSL 模块需要 1.1.1 的 OpenSSL 版本。 对于已弃用的常量和函数,存在弃用警告。

【讨论】:

以上是关于如何使用 Python 创建 SSL 套接字服务器的主要内容,如果未能解决你的问题,请参考以下文章

SSL 套接字连接

TLS/SSL 套接字 python 服务器

实现 SSL 证书的 Python 套接字 [关闭]

带有 ssl 的 Python 套接字以防止中间攻击

带有 Python SSL 套接字的自签名证书

Python 套接字客户端 SSL 连接