面试题答案
一键面试引入SSL/TLS加密的一般步骤
- 导入必要的模块:在Python中,需要导入
ssl
模块来处理SSL/TLS相关操作,同时导入socket
模块用于基本的套接字通信。 - 创建套接字对象:使用
socket.socket()
创建一个普通的TCP套接字。 - 加载SSL/TLS上下文:通过
ssl.SSLContext()
创建一个SSL/TLS上下文对象,并根据需求配置上下文,例如设置协议版本、加载证书和私钥等。 - 包装套接字:使用SSL/TLS上下文对象的
wrap_socket()
方法来包装之前创建的普通套接字,将其转换为加密的套接字。 - 进行通信:使用包装后的套接字进行常规的套接字通信操作,如连接、发送和接收数据。
代码示例
以下是一个简单的服务器端代码示例,展示如何为TCP套接字添加SSL/TLS加密:
import socket
import ssl
# 创建TCP套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8443))
server_socket.listen(1)
# 创建SSL上下文
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.load_cert_chain(certfile='server.crt', keyfile='server.key')
while True:
print('等待连接...')
client_socket, client_address = server_socket.accept()
print('接受来自', client_address, '的连接')
# 使用SSL上下文包装套接字
ssl_client_socket = context.wrap_socket(client_socket, server_side=True)
try:
data = ssl_client_socket.recv(1024)
print('接收到数据:', data.decode())
ssl_client_socket.sendall(b'Hello from server!')
except ssl.SSLError as e:
print('SSL错误:', e)
finally:
ssl_client_socket.close()
以下是对应的客户端代码示例:
import socket
import ssl
# 创建TCP套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 创建SSL上下文
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.load_verify_locations(cafile='server.crt')
# 使用SSL上下文包装套接字
ssl_client_socket = context.wrap_socket(client_socket, server_hostname='localhost')
ssl_client_socket.connect(('localhost', 8443))
try:
ssl_client_socket.sendall(b'Hello from client!')
data = ssl_client_socket.recv(1024)
print('接收到数据:', data.decode())
finally:
ssl_client_socket.close()
上述代码中,服务器端加载了自己的证书和私钥,客户端加载了服务器的证书用于验证服务器身份。运行代码前,需要确保server.crt
和server.key
文件存在且路径正确。