Python使用ssl模块进行SSL握手和验证

2023-03-30 00:00:00 模块 握手 验证

在Python中,可以使用ssl模块进行SSL握手和验证。下面是一个简单的代码演示,其中我们使用前面创建的自签名SSL证书进行验证:

import socket
import ssl

# 创建SSL上下文
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain("server.crt", "server.key")

# 创建socket并进行SSL握手
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8443))
server_socket.listen()
print("Listening on port 8443...")
while True:
    conn, addr = server_socket.accept()
    ssl_conn = context.wrap_socket(conn, server_side=True)
    print("SSL handshake successful with", addr)

    # 验证SSL证书
    cert = ssl_conn.getpeercert()
    if not cert:
        print("No certificate found.")
    else:
        print("Certificate found:", cert)
        if ssl.match_hostname(cert, "pidancode.com"):
            print("Certificate hostname matches.")
        else:
            print("Certificate hostname doesn't match.")

    # 发送数据并关闭连接
    ssl_conn.write(b"Welcome to Pidancode!")
    ssl_conn.close()

上述代码创建了一个SSL上下文,并加载之前创建的自签名SSL证书和私钥。然后,我们创建了一个TCP socket并监听端口8443。当有客户端连接时,我们使用SSL上下文对socket进行封装,进行SSL握手。

接下来,我们获取SSL证书并进行验证。如果证书无法获取,则认为验证失败。否则,我们使用ssl.match_hostname()函数验证证书的CN是否与我们期望的主机名“pidancode.com”匹配。最后,我们向客户端发送数据并关闭连接。

注意,在实际生产环境中,应该使用受信任的证书机构颁发的证书进行验证。而在开发和测试阶段,可以使用自签名证书进行测试。

相关文章