Python中的后量子TLS测试指南

本文详细介绍了如何在Python应用程序中测试后量子TLS连接,包括构建容器、运行测试以及验证PQ混合TLS协商的具体步骤,帮助开发者提前为量子安全迁移做准备。

Python中的后量子TLS测试

在亚马逊网络服务(AWS),安全是首要任务。维护数据保密性是AWS及客户运营环境安全的重要组成部分。尽管尚未问世,但密码学相关的量子计算机(CRQC)可能被用于破解当前用于提供数据保密性的公钥算法。为准备CRQC可能存在的世界,美国国家标准与技术研究院(NIST)发起了寻找能够抵抗潜在CRQC的新算法的搜索。2024年8月,经过密码学社区八年的严格审查,NIST选择了三种后量子密码学(PQC)标准,包括FIPS 203的ML-KEM,以补充并最终替代经典公钥算法。

最近的几篇AWS博客文章讨论了AWS中的PQC,特别是使用ML-KEM的后量子传输层安全(PQ TLS):

  • 什么是PQ TLS及其工作原理
  • 深入探讨PQ TLS性能
  • 在AWS SDK for Java v2中使用PQ TLS
  • AWS PQC迁移计划

在本文中,我们演示了如何在Python应用程序中测试PQ TLS。

在Python中测试PQ TLS

如其他地方详细描述,AWS目前以混合配置部署PQ TLS,其中经典密钥交换与ML-KEM一起使用,为数据保密性提供深度防御。ML-KEM的密钥比经典方案大得多,因此混合TLS握手在建立连接时发送和接收更多数据。与其他协议更新一样,在您的网络中测试混合TLS以验证安全设备和网络设备能否正确处理这些连接非常重要。我们希望您发现提供的AWS示例对此类测试有用。

要协商混合TLS,连接的两端都需要支持PQ的软件:客户端和服务器。AWS目前正在服务器端透明地推出混合TLS,无需客户配置。在客户端,每种语言SDK启用混合TLS的方式略有不同。

AWS SDK for Python(Boto3)依赖Python解释器的ssl模块进行TLS,而该模块又使用操作系统的密码学库。对于大多数Linux发行版,这是OpenSSL。OpenSSL最近宣布支持混合TLS,并在版本3.5中默认启用。然而,OpenSSL 3.5尚未成为大多数操作系统发行版的默认版本。

为了解除测试障碍,我们提供了一个容器定义,该定义在标准Python发行版旁边安装OpenSSL 3.5,允许Python应用程序执行PQ混合TLS连接。容器定义还安装了常见包,如boto3和requests。我们提供了示例Python代码,用于与以下内容进行基本交互:AWS服务(使用boto3和AWS命令行界面(AWS CLI))、任意HTTPS端点(使用requests)以及TLS保护的TCP服务器(使用Python的标准库ssl模块)。

在以下部分,我们将逐步介绍如何使用此容器定义测试从Python应用程序到AWS服务的PQ TLS连接。

构建容器

您可以在本地机器上构建此容器,也可以在云环境(如Amazon Elastic Compute Cloud(Amazon EC2)或AWS CloudShell)中构建。请注意,如果您想测试机器与AWS之间的网络路径,必须在本地构建和运行容器。构建容器的唯一先决条件是安装了Docker(或等效的容器工具)。为简单起见,以下步骤主要假设您在Linux CloudShell环境中运行这些命令。

  1. 克隆示例仓库:git clone https://github.com/aws-samples/sample-post-quantum-tls-python
  2. 进入示例目录并构建容器,执行以下命令:cd sample-post-quantum-tls-python && docker build . -t pq-tls-python

运行容器

要运行前面描述的示例,执行以下命令:

1
2
3
4
5
docker run --rm \
    -e AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id) \
    -e AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key) \
    -it pq-tls-python \
    test.sh

前面的命令假设您有一个具有调用AWS Secrets Manager ListSecrets API权限的AWS CLI默认配置文件。有了此权限,您可以对支持PQ的Secrets Manager API端点进行基本的只读测试调用,这些调用不会返回敏感或秘密值。在CloudShell中,您需要使用aws configure设置访问密钥和秘密密钥值。在Amazon EC2中,您可以配置实例配置文件并移除访问密钥和秘密密钥环境变量。

在打印出Python使用的密码学库的名称和版本后,test.sh将测试用于保护以下内容的混合TLS连接(按顺序):

  • 使用Python的socket和ssl模块的TCP套接字
  • 使用requests库的HTTP请求
  • 使用boto3和AWS CLI的AWS API请求

如果测试成功,您应该看到以下输出:

1
2
3
4
5
Crypto library: OpenSSL 3.5.0 8 Apr 2025
Testing ssl socket... ok
Testing requests... ok
Testing boto3... ok
Testing AWS CLI... ok

您可以根据需要检查、修改和扩展tests/目录中的示例。除了运行提供的test.sh脚本,您还可以使用以下命令访问交互式shell。

1
docker run --rm -it pq-tls-python

如果您添加或修改文件进行测试,请确保重新构建容器。

确认PQ TLS协商

要确认PQ混合TLS已协商,检查示例的TLS握手以确认执行了PQ混合TLS密钥交换。为此,您必须捕获主机网络流量。在CloudShell中,您可以使用以下命令执行此操作:

1
sudo tcpdump -A -i docker0 -w pq_tls.pcap

这将捕获Docker的网络接口docker0上的流量。或者,如果您在本地运行容器,可以在Wireshark的GUI中在本地网络接口(如Linux上的docker0或MacOS上的en0)上执行数据包捕获。

接下来,在单独终端中使用“运行容器”部分的Docker run命令运行测试套件。如前所述,您应该在终端中看到成功消息,如果使用tcpdump,还会看到一个名为pq_tls.pcap的新文件。您可以从CloudShell下载此文件以在本地Wireshark中查看。具体来说,查找客户端或服务器Hello握手消息中的key_share扩展。如果您使用Wireshark查看数据包捕获,可以指定显示过滤器tls.handshake以仅显示握手消息。您的数据包捕获应类似于图1:

您可以在图1中看到,在服务器Hello握手消息中选择了X25519MLKEM768,表明PQ混合TLS已成功协商。

结论

在本文中,您已经了解了如何使用容器定义在Python中测试PQ混合TLS。链接的AWS示例展示了如何为以下内容建立PQ混合TLS连接:

  • 使用boto3或AWS CLI的AWS API请求
  • 使用requests的一般HTTPS请求
  • 使用Python的socket和ssl模块的TLS保护TCP套接字

我们鼓励您使用AWS示例开始审查您的网络和Python应用程序,为即将到来的PQ混合TLS迁移做准备。AWS致力于在客户的迁移旅程中提供支持,PQ混合TLS也不例外。

如果您对本文有反馈,请在下面的评论部分提交评论。如果您对本文有疑问,请联系AWS支持。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计