Python中如何实现基于SSL的双向认证
发布时间:2023-12-23 08:26:10
在Python中,可以使用ssl模块来实现基于SSL的双向认证。下面是一个使用例子,包括服务器和客户端的代码:
服务器端代码:
import ssl
import socket
# 生成SSL上下文
context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
# 加载服务器端证书和私钥
context.load_cert_chain(certfile="server.crt", keyfile="server.key")
# 验证客户端证书和设置可信证书颁发机构列表
context.verify_mode = ssl.CERT_REQUIRED
context.load_verify_locations(cafile="ca.crt")
# 创建Socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址
server_socket.bind(('localhost', 12345))
# 监听连接
server_socket.listen(1)
while True:
# 接受客户端连接
client_socket, client_address = server_socket.accept()
# 构建SSL套接字
ssl_socket = context.wrap_socket(client_socket, server_side=True)
# 读取客户端数据
data = ssl_socket.recv(1024)
print("Received from client:", data.decode())
# 发送响应给客户端
ssl_socket.send("Hello from server".encode())
# 关闭连接
ssl_socket.close()
客户端代码:
import ssl
import socket
# 生成SSL上下文
context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH)
# 加载客户端证书和私钥
context.load_cert_chain(certfile="client.crt", keyfile="client.key")
# 验证服务器证书和设置可信证书颁发机构列表
context.verify_mode = ssl.CERT_REQUIRED
context.load_verify_locations(cafile="ca.crt")
# 创建Socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
client_socket.connect(('localhost', 12345))
# 构建SSL套接字
ssl_socket = context.wrap_socket(client_socket, server_hostname='localhost')
# 发送数据给服务器
ssl_socket.send("Hello from client".encode())
# 接收服务器响应
data = ssl_socket.recv(1024)
print("Received from server:", data.decode())
# 关闭连接
ssl_socket.close()
在以上代码中,需要将服务器端的证书(server.crt)、私钥(server.key)和根证书颁发机构(ca.crt)替换为真实的证书文件路径,客户端也是类似。这里需要注意,服务器端验证客户端证书时,需要将客户端的证书和私钥(client.crt和client.key)替换为实际的证书文件路径。
服务器端代码首先生成SSL上下文,加载服务器端的证书和私钥,并设置验证模式为必须验证客户端证书,加载可信证书颁发机构列表。然后,创建Socket对象,绑定地址并监听连接。
在循环中,接受客户端连接后,使用SSL上下文来包装Socket对象,从SSL套接字中读取客户端数据,并发送响应给客户端。
客户端代码也先生成SSL上下文,加载客户端的证书和私钥,并设置验证模式和可信证书颁发机构列表。然后,创建Socket对象,连接服务器。
然后,使用SSL上下文来包装Socket对象,发送数据给服务器,并接收服务器的响应。
最后,关闭SSL套接字。
这样,服务器和客户端就可以通过SSL套接字进行基于SSL的双向认证了。
