Python使用ssl模块进行SSL握手和验证
在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”匹配。最后,我们向客户端发送数据并关闭连接。
注意,在实际生产环境中,应该使用受信任的证书机构颁发的证书进行验证。而在开发和测试阶段,可以使用自签名证书进行测试。
相关文章