Python中的后量子TLS实现与AWS实战指南
背景与动机
在亚马逊云科技(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测试
混合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支持。