1. 使用 Docker 编译 OpenSSL 3.5.6
Dockerfile 如下:
# 基础镜像:使用 Red Hat Universal Base Image 9
FROM redhat/ubi9:latest
# Update packages
# 更新系统软件包
RUN dnf -y update && dnf upgrade -y
# Get build dependencies
# 安装编译依赖项
RUN dnf -y install perl-core zlib-devel kernel-headers make gcc wget
# Get all sources
# 获取 OpenSSL 源码
WORKDIR /tmp
RUN wget https://github.com/openssl/openssl/releases/download/openssl-3.5.6/openssl-3.5.6.tar.gz
RUN tar -xvf openssl-3.5.6.tar.gz
# Build & install
# 编译并安装 OpenSSL
WORKDIR /tmp/openssl-3.5.6
RUN ./config --prefix=/opt/openssl --openssldir=/opt/openssl -Wl,-rpath=/opt/openssl/lib64 shared zlib
RUN make -j 4
RUN make install
# 容器启动时执行 openssl version 验证
CMD ["/opt/openssl/bin/openssl", "version"]
构建镜像(耗时较长):
docker build -t openssl356:ubi9 .
2. 本地直接编译
也可以选择本地编译,注意安装到自定义目录,避免与系统已有 OpenSSL 冲突。
wget https://github.com/openssl/openssl/releases/download/openssl-3.5.6/openssl-3.5.6.tar.gz
tar -xvf openssl-3.5.6.tar.gz
./config --prefix=/opt/openssl --openssldir=/opt/openssl -Wl,-rpath=/opt/openssl/lib64 shared zlib
make -j $(nproc)
make install
安装路径默认为 /opt/openssl/bin,后续命令均在该目录下执行。
3. 生成后量子测试证书
进入测试目录:
mkdir -p /opt/openssl/bin/test
cd /opt/openssl/bin/test
使用 ML-DSA-44 算法生成 CA 证书和私钥:
../openssl genpkey -algorithm ML-DSA-44 -out ca-key.pem
../openssl req -x509 -new -key ca-key.pem -days 3650 -out ca-cert.pem -subj "/CN=Post-Quantum-CA"
生成服务器端密钥与证书:
../openssl genpkey -algorithm ML-DSA-44 -out server-key.pem
../openssl req -new -key server-key.pem -out server-csr.pem -subj "/CN=localhost"
../openssl x509 -req -in ./server-csr.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -days 3650
../openssl x509 -in ./server-cert.pem -noout -text
生成客户端密钥与证书:
../openssl genpkey -algorithm ML-DSA-44 -out client-key.pem
../openssl req -new -key client-key.pem -out client-csr.pem -subj "/CN=client"
../openssl x509 -req -in ./client-csr.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem -days 3650
../openssl x509 -in ./client-cert.pem -noout -text
4. 启动抓包并验证 TLS 1.3 后量子握手
先开启抓包(保存 pcap 文件):
tcpdump -i any port 4433 -w ./pqc.pcap
启动服务端,指定后量子算法组:
../openssl s_server -accept 4433 -cert server-cert.pem -key server-key.pem -CAfile ca-cert.pem -Verify 1 -groups SecP384r1MLKEM1024:MLKEM512:MLKEM768:MLKEM1024:SecP256r1MLKEM768:X25519MLKEM768 -state -verify_return_error
在另一个终端启动客户端:
../openssl s_client -connect localhost:4433 -cert client-cert.pem -key client-key.pem -CAfile ca-cert.pem -groups SecP384r1MLKEM1024:MLKEM512:MLKEM768:MLKEM1024:SecP256r1MLKEM768:X25519MLKEM768 -status -verify_return_error
握手完成后,可以通过 Wireshark 打开抓包文件 pqc.pcap 分析后量子密钥交换过程:

