在客户端和服务器安全通信之前,首先需要设置几项内容,包括使用哪种加密算法和密钥、哪种 MAC 算法、哪种密钥交换算法等。这些密码学参数需要由客户端和服务器协商,这是 TLS 握手协议的主要目的。在此任务中,我们专注于TLS握手协议。以下示例代码启动了一个与 TLS 服务器之间的 TLS 握手(服务器名称需要指定为第一个命令行参数)。

/* handshake.py: 在 Labsetup/volumes 目录下 */
#!/usr/bin/env python3
import socket, ssl, sys, pprint

hostname = sys.argv[1]
port = 443
cadir = '/etc/ssl/certs'

# Set up the TLS context
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.load_verify_locations(capath=cadir)
context.verify_mode = ssl.CERT_REQUIRED
context.check_hostname = True

# Create TCP connection
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((hostname, port))
input("After making TCP connection. Press any key to continue ...")

# Add the TLS
ssock = context.wrap_socket(sock, server_hostname=hostname,
                            do_handshake_on_connect=False)
ssock.do_handshake()   # Start the handshake
pprint.pprint(ssock.getpeercert())
input("After handshake. Press any key to continue ...")

# Close the TLS Connection
ssock.shutdown(socket.SHUT_RDWR)
ssock.close()

任务。使用上面的代码与真实的基于 HTTPS 的 Web 服务器进行通信。可能需要添加其他代码才能完成任务。学生可以在网络上找到 Python 的 SSL 模块手册。请报告以下内容:
  • 客户端和服务器之间使用的加密算法是什么?
  • 请在程序中输出服务器证书。
  •  说明 /etc/ssl/certs 的作用。   
  •  使用 Wireshark 在程序执行期间捕获网络流量,并解释你的观察结果。请说明哪个步骤触发 TCP 握手,以及哪个步骤触发 TLS 握手。解释 TLS 握手和 TCP 握手之间的关系。
 




Last modified: Tuesday, 13 May 2025, 8:58 AM