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环境中运行这些命令。
- 克隆示例仓库:
git clone https://github.com/aws-samples/sample-post-quantum-tls-python
- 进入示例目录并构建容器,执行以下命令:
cd sample-post-quantum-tls-python && docker build . -t pq-tls-python
运行容器
要运行前面描述的示例,执行以下命令:
|
|
前面的命令假设您有一个具有调用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请求
如果测试成功,您应该看到以下输出:
|
|
您可以根据需要检查、修改和扩展tests/
目录中的示例。除了运行提供的test.sh
脚本,您还可以使用以下命令访问交互式shell。
|
|
如果您添加或修改文件进行测试,请确保重新构建容器。
确认PQ TLS协商
要确认PQ混合TLS已协商,检查示例的TLS握手以确认执行了PQ混合TLS密钥交换。为此,您必须捕获主机网络流量。在CloudShell中,您可以使用以下命令执行此操作:
|
|
这将捕获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支持。