Docker 化的 PQC 工具箱指南

本指南适用于 PQC 容器化工具包。有关设置 DigiCert PQC 工具包的说明,请参阅 PQC 工具包设置指南

引言

DigiCert 的后量子加密 (PQC) 工具包包含为了快速设置容器环境以创建混合 TLS 证书而需要了解的一切信息。该混合证书结合使用后量子加密算法和传统加密算法。这使得您能够测试部署后量子混合 TLS 证书的可行性,并保持向后兼容性。

该指南向您介绍如何使用 DigiCert PQC 容器化工具包执行以下任务:

  • 使用 docker-compose 启动 Docker 容器。
  • 进入正在运行的 PQC 容器。
  • 执行所含的演示脚本以测试示例 PQC 证书。
  • 生成后量子加密密钥。
  • 创建完整的混合证书链,包括根证书、中间证书和服务器证书。
  • 使用 OpenSSL 的 s_servers_client 实用工具测试证书。

DigiCert PQC 容器化工具包可供所有 Secure Site Pro 客户下载。了解有关每个 Secure Site Pro 证书所含项目的更多信息

PQC 容器化工具包内容

DigiCert PQC 容器化工具包包含以下文件:

  • Dockerfile
  • docker-compose.yml
  • 带有 ISARA Catalyst OpenSSL Connector 补丁的编译 OpenSSL
  • 演示证书和配置文件
  • 用于测试证书生成和功能的 bash 脚本

先决条件

在使用此指南之前,请确保满足以下先决条件:

检查您的 Docker 版本

在下载 PQC 容器化工具包之前,确认在您的系统上已经安装了 Docker Engine 和 Docker Compose。

如果没有识别到这些命令,则表示在您的系统上没有安装 Docker。请参阅先决条件,了解有关在系统上安装 Docker 的信息。

Linux/macOS

打开终端窗口并运行 docker --versiondocker-compose --version。这应该会返回与下述类似的输出。

bash
$ docker --version
Docker version 18.03.0-ce, build 0520e24

$ docker-compose --version
docker-compose version 1.20.1, build 5d8c71b

Windows

打开命令提示符或 PowerShell 窗口并运行 docker --version。这应该会返回与下述类似的输出。

powershell
> docker --version
Docker version 18.03.0-ce, build 0520e24

下载并提取 PQC 容器化工具包

  1. 登录 CertCentral 帐户。
  2. 在侧栏菜单中,单击证书 > 订单
  3. 在“订单”页面上找到您的 Secure Site Pro 证书订单并单击其订单编号。
  4. 在证书的订单详细信息页上,单击 PQC 工具包
  5. 在后量子加密 (PQC) 页面上,单击下载 Docker 支持文件并保存 zip 文件。
  6. 找到保存的 zip 文件 (DigiCert-PQC.zip) 并提取文件内容。

构建并运行 PQC 工具包容器

下载并提取 PQC 容器化工具包后,可以使用 docker-compose 构建容器。

打开终端窗口并浏览至提取的 digicert-pqc-docker 目录。

bash
cd [path/to/dir/]digicert-pqc-docker

然后,构建 PQC 工具包容器。这会下载所有图像依赖项并配置容器环境。

如果这是您首次运行该命令,可能需要等待从 Docker Hub 下载所需的 Ubuntu 图像。

bash
docker-compose build

现在可以在分离模式中启动 PQC 工具包容器。

bash
docker-compose up -d
Starting digicert-pqc-docker_pqc_1 ... done

恭喜!PQC 容器化工具包容器已启动并运行。

要访问容器环境并开始试验,请参阅进入容器

进入容器

要试验所含的演示脚本和修改的 OpenSSL 应用,首先需要进入容器环境。

使用 docker-compose exec 在运行的容器中启动 bash 会话。

bash
docker-compose exec pqc /bin/bash

目录树

首次进入容器时,将进入 /app 目录。该目录是整个 PQC 工具包和补充资源的首页。下表介绍了位于 /app 目录中的重要子目录和文件。

目录/文件 描述
digicert-pqc/ 主工具包目录。
 certs/ 用于存储生成的证书的目录。
 connector/ ISARA Catalyst OpenSSL Connector 资源。
 demo/ 演示脚本和资源。
  certs/ 用于存储生成的演示证书的目录。
  configs/ 含有在生成演示证书时使用的证书配置文件。
   demo.html 在 Web 服务器模式下执行时可通过 run_server.sh 脚本提供的 HTML 文件。
   cert_gen_demo.sh 使用位于 /app/digicert-pqc/demo/configs 的配置文件生成和测试完整的量子安全证书链。
请参阅生成演示证书
   run_client.sh 连接至运行的 s_server,使用 OpenSSL 的 s_client 实用程序测试证书功能。
请参阅基本模式:使用 run_client.sh 脚本进行连接。
   run_server.sh 使用 OpenSSL 的 s_server 实用程序启动基本 Web 服务器并加载位于 /app/digicert-pqc/demo/certs 的证书。
请参阅启动演示服务器
 pqpki-openssl-1.0.2r/ 使用 ISARA OpenSSL Connector 补丁修改的编译 OpenSSL 版本 1.0.2r。
resources/ 补充性 PQC 工具包资源文件。

生成演示证书

要自定义任何证书的字段值,请修改证书配置文件(位于 /app/digicert-pqc/demo/configs)。

要生成完整的量子安全证书链,请使用 cert_gen_demo.sh 脚本(位于 /app/digicert-pqc/demo)。执行后会发生以下情况:

  • 位于 /app/digicert-pqc/demo/certs 目录的所有文件被删除。
  • 生成完整的量子安全证书链(包括根证书、中间证书和服务器证书)。文件保存在 /app/digicert-pqc/demo/certs
  • 使用旧加密方法验证证书链。
  • 使用量子安全加密方法验证证书链。

在生成演示证书之前,确保进入 /app/digicert-pqc/demo 目录。

然后,执行脚本。

bash
cd /app/digicert-pqc/demo
./cert_gen_demo.sh

您将看到以下输出:

bash
engine "IQREngine" set.
XMSS key pair has been generated:
engine "IQREngine" set.
DILITHIUM key pair has been generated:
engine "IQREngine" set.
RAINBOW key pair has been generated:
engine "IQREngine" set.
engine "IQREngine" set.
engine "IQREngine" set.
Generating a EC private key
writing new private key to '/app/digicert-pqc/demo/certs/ecdsa_without_xmss_catalyst_mixed_chain_root_private_key.pem'
-----
Signature ok
subject=/C=US/ST=Utah/L=Lehi/O=DigiCert, Inc./OU=DigiCert PQC/CN=DigiCert PQC Root
Getting Private key
engine "IQREngine" set.
Successfully created XMSS signature
Generating a EC private key
writing new private key to '/app/digicert-pqc/demo/certs/ecdsa_without_dilithium_catalyst_mixed_chain_intermediate_private_key.pem'
-----
engine "IQREngine" set.
Signature ok
subject=/C=US/ST=Utah/L=Lehi/O=DigiCert, Inc./OU=DigiCert PQC/CN=DigiCert PQC Test Intermediate CA
Getting CA Private Key
engine "IQREngine" set.
Successfully created XMSS signature
Generating a EC private key
writing new private key to '/app/digicert-pqc/demo/certs/ecdsa_without_rainbow_catalyst_mixed_chain_private_key.pem'
-----
engine "IQREngine" set.
Signature ok
subject=/C=US/ST=Utah/L=Lehi/O=DigiCert, Inc./OU=DigiCert PQC/CN=digicert.pqc
Getting CA Private Key
engine "IQREngine" set.
engine "IQREngine" set.
/app/digicert-pqc/demo/certs/rainbow_ecdsa_x509_catalyst_mixed_chain_server_certificate.pem: OK
engine "IQREngine" set.
2 : ok : /C=US/ST=Utah/L=Lehi/O=DigiCert, Inc./OU=DigiCert PQC/CN=DigiCert PQC Root
1 : ok : /C=US/ST=Utah/L=Lehi/O=DigiCert, Inc./OU=DigiCert PQC/CN=DigiCert PQC Test Intermediate CA
0 : ok : /C=US/ST=Utah/L=Lehi/O=DigiCert, Inc./OU=DigiCert PQC/CN=digicert.pqc
Success!!

启动演示服务器

要测试生成的演示证书,请执行 run_server.sh 脚本。可以在以下其中一种模式中执行该脚本:基本模式或 HTTP 模式。

  • 对于基本模式,删除可选的 http 参数。
  • 对于 HTTP 模式,包括可选的 http 参数。
模式 命令 描述
基本 ./run_server.sh 启动 OpenSSL s_server,它接受使用 OpenSSL s_client 实用程序进行连接。
HTTP ./run_server.sh http 启动 OpenSSL s_server,它接受在端口 443 上建立 HTTPS 连接。

停止正在运行的 s_server,在运行服务器的终端窗口中,按 CTRL +C

在基本模式中启动服务器

在基本模式中启动演示服务器之前,确保进入 /app/digicert-pqc/demo 目录且已生成演示证书

然后,执行脚本。

bash
./run_server.sh

您将看到以下输出:

bash
engine "IQREngine" set.
Using default temp DH parameters
ACCEPT

现在,s_server 实用程序正在基本模式中运行,可以接受通过 s_client 建立连接。要与正在运行的演示服务器建立连接,请参阅基本模式:使用 run_client.sh 脚本进行连接。

在 HTTP 模式中启动服务器

在 HTTP 模式中启动演示服务器之前,确保进入 /app/digicert-pqc/demo 目录且已生成演示证书

然后,执行脚本并包括 http 参数。

bash
./run_server.sh http

您将看到以下输出:

bash
engine "IQREngine" set.
Using default temp DH parameters
ACCEPT

现在,s_server 实用程序正在 HTTP 模式中运行,可以接受通过端口 443 上的 HTTPS 建立连接。要与正在运行的演示服务器建立连接,请参阅使用 cURL 建立连接

与正在运行的演示服务器建立连接

在运行 run_server.sh 脚本以启动演示服务器后,可以与它建立连接并测试演示证书链。

与正在运行的演示服务器建立连接的方式取决于启动服务器时所使用的模式。

基本模式:使用 run_client.sh 脚本进行连接

run_client.sh 脚本使用 OpenSSL s_client 实用程序与正在运行的 s_server 建立连接。在执行该脚本之前,确保在基本模式中执行 run_server.sh 脚本以启动 s_server。请参阅在基本模式中启动服务器

在其中一个终端窗口中有一个活跃的 s_server 以基本模式运行时,打开新的终端窗口。在新窗口中,使用 docker-compose exec 启动另一个 bash 会话。

bash
cd [path/to/dir/]digicert-pqc-docker
docker-compose exec pqc /bin/bash

浏览至演示目录并执行 run_client.sh 脚本。

bash
cd /app/digicert-pqc/demo
./run_client.sh

您将看到以下输出:

bash
engine "IQREngine" set.
CONNECTED(00000003)
depth=1 C = US, ST = Utah, L = Lehi, O = "DigiCert, Inc.", OU = DigiCert PQC, CN = DigiCert PQC Root
verify return:1
depth=0 C = US, ST = Utah, L = Lehi, O = "DigiCert, Inc.", OU = DigiCert PQC, CN = DigiCert PQC Test Intermediate CA
verify return:1
---
Certificate chain
 0 s:/C=US/ST=Utah/L=Lehi/O=DigiCert, Inc./OU=DigiCert PQC/CN=DigiCert PQC Test Intermediate CA
   i:/C=US/ST=Utah/L=Lehi/O=DigiCert, Inc./OU=DigiCert PQC/CN=DigiCert PQC Root
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
---
Server certificate
subject=/C=US/ST=Utah/L=Lehi/O=DigiCert, Inc./OU=DigiCert PQC/CN=DigiCert PQC Test Intermediate CA
issuer=/C=US/ST=Utah/L=Lehi/O=DigiCert, Inc./OU=DigiCert PQC/CN=DigiCert PQC Root
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 9868 bytes and written 2331 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-NHDH-DILM-AES256-GCM-SHA384
Server public key is 521 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-NHDH-DILM-AES256-GCM-SHA384
    Session-ID: {{Session-ID}}
    Session-ID-ctx: 
    Master-Key: {{Master-Key}}
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 7200 (seconds)
    TLS session ticket:
    [...]


    Start Time: 1563994600
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
---

在活跃的 s_server 正在运行的另一个终端窗口中,您将看到以下输出:

bash
read from 0x5581e0750b80 [0x5581e07656f3] (5 bytes => 5 (0x5))
0000 - 16 03 01 00 96                                    .....
read from 0x5581e0750b80 [0x5581e07656f8] (150 bytes => 150 (0x96))
0000 - 01 00 00 92 03 03 d9 c0-5a 73 35 d0 4e f2 31 f6   ........Zs5.N.1.
[...]
write to 0x5581e0750b80 [0x5581e076e100] (71 bytes => 71 (0x47))
0000 - 16 03 03 00 42 02 00 00-3e 03 03 c2 3b df 2f 01   ....B...>...;./.
[...]
write to 0x5581e0750b80 [0x5581e0769c43] (4953 bytes => 4953 (0x1359))
0000 - 16 03 03 13 54 0b 00 13-50 00 13 4d 00 13 4a 30   ....T...P..M..J0
[...]
write to 0x5581e0750b80 [0x5581e0769c43] (4609 bytes => 4609 (0x1201))
0000 - 16 03 03 11 fc 0c 00 11-f8 03 00 17 41 04 0d 97   ............A...
[...]
write to 0x5581e0750b80 [0x5581e076e100] (9 bytes => 9 (0x9))
0000 - 16 03 03 00 04 0e 00 00-00                        .........
read from 0x5581e0750b80 [0x5581e07656f3] (5 bytes => 5 (0x5))
0000 - 16 03 03 08 48                                    ....H
read from 0x5581e0750b80 [0x5581e07656f8] (2120 bytes => 2120 (0x848))
0000 - 10 00 08 44 41 04 29 0a-07 84 0c f3 a4 e4 3e d1   ...DA.).......>.
[...]
read from 0x5581e0750b80 [0x5581e07656f3] (5 bytes => 5 (0x5))
0000 - 14 03 03 00 01                                    .....
read from 0x5581e0750b80 [0x5581e07656f8] (1 bytes => 1 (0x1))
0000 - 01                                                .
read from 0x5581e0750b80 [0x5581e07656f3] (5 bytes => 5 (0x5))
0000 - 16 03 03 00 28                                    ....(
read from 0x5581e0750b80 [0x5581e07656f8] (40 bytes => 40 (0x28))
0000 - e1 d7 30 8b 12 ef d1 dc-31 90 97 d0 0e 54 9c aa   ..0.....1....T..
[...]
write to 0x5581e0750b80 [0x5581e076e100] (175 bytes => 175 (0xAF))
0000 - 16 03 03 00 aa 04 00 00-a6 00 00 1c 20 00 a0 02   ............ ...
[...]
write to 0x5581e0750b80 [0x5581e076e100] (6 bytes => 6 (0x6))
0000 - 14 03 03 00 01 01                                 ......
write to 0x5581e0750b80 [0x5581e076e100] (45 bytes => 45 (0x2D))
0000 - 16 03 03 00 28 d0 99 97-94 6d a1 5c f8 b0 c0 65   ....(....m.\...e
[...]
-----BEGIN SSL SESSION PARAMETERS-----
[...]
-----END SSL SESSION PARAMETERS-----
Shared ciphers:ECDHE-NHDH-DILM-AES256-GCM-SHA384:ECDHE-NHDH-SIDH-DILM-AES256-GCM-SHA384
Signature Algorithms: RSA+SHA512:DSA+SHA512:ECDSA+SHA512:RSA+SHA384:DSA+SHA384:ECDSA+SHA384:RSA+SHA256:DSA+SHA256:ECDSA+SHA256:RSA+SHA224:DSA+SHA224:ECDSA+SHA224:RSA+SHA1:DSA+SHA1:ECDSA+SHA1:HSS+SHA512:XMSS+SHA512:XMSSmt+SHA512:DILITHIUM+SHA512:DILITHIUM+SHA512:0xE0+SHA512
Shared Signature Algorithms: RSA+SHA512:DSA+SHA512:ECDSA+SHA512:RSA+SHA384:DSA+SHA384:ECDSA+SHA384:RSA+SHA256:DSA+SHA256:ECDSA+SHA256:RSA+SHA224:DSA+SHA224:ECDSA+SHA224:RSA+SHA1:DSA+SHA1:ECDSA+SHA1:HSS+SHA512:DILITHIUM+SHA512:DILITHIUM+SHA512
Supported Elliptic Curve Point Formats: uncompressed:ansiX962_compressed_prime:ansiX962_compressed_char2
Supported Elliptic Curves: P-256:P-521:brainpoolP512r1:brainpoolP384r1:P-384:brainpoolP256r1:secp256k1:B-571:K-571:K-409:B-409:K-283:B-283:0xFE01
Shared Elliptic curves: P-256:P-521:brainpoolP512r1:brainpoolP384r1:P-384:brainpoolP256r1:secp256k1:B-571:K-571:K-409:B-409:K-283:B-283:UNDEF
CIPHER is ECDHE-NHDH-DILM-AES256-GCM-SHA384
Secure Renegotiation IS supported

HTTP 模式:使用 cURL 建立连接

要使用 cURL 与正在运行的 s_server 建立连接,确保在 HTTP 模式中启动 s_server。请参阅在 HTTP 模式中启动服务器

其中一个终端窗口中有一个活跃的 演示服务器以 HTTP 模式运行时,首先需要打开一个新的终端窗口。在新窗口中,使用 docker-compose exec 启动另一个 bash 会话。

bash
cd [path/to/dir/]digicert-pqc-docker
docker-compose exec pqc /bin/bash

现在,使用 cURL 与正在运行的服务器建立连接。您生成的演示证书是自签名证书,将引发不受信任的证书警告。要忽略这些警告,必须包括 -k 开关。

bash
curl -k https://digicert.pqc/demo.html

您将看到以下输出:

bash
<html>
<head></head>
<body>
  <h1>Hello world! PQC FUTURE IS HERE!</h1>
</body>
</html>

在活跃的 s_server 正在运行的另一个终端窗口中,您将看到以下输出:

bash
read from 0x556d44ced1e0 [0x556d44cf61a3] (5 bytes => 5 (0x5))
0000 - 16 03 01 02 00                                    .....
read from 0x556d44ced1e0 [0x556d44cf61a8] (512 bytes => 512 (0x200))
0000 - 01 00 01 fc 03 03 a3 d2-a7 5e 12 44 88 93 78 fd   .........^.D..x.
[...]
write to 0x556d44ced1e0 [0x556d44d05120] (94 bytes => 94 (0x5E))
0000 - 16 03 03 00 59 02 00 00-55 03 03 36 a7 a4 2d 57   ....Y...U..6..-W
[...]
write to 0x556d44ced1e0 [0x556d44cffc53] (4954 bytes => 4954 (0x135A))
0000 - 16 03 03 13 55 0b 00 13-51 00 13 4e 00 13 4b 30   ....U...Q..N..K0
[...]
write to 0x556d44ced1e0 [0x556d44d05120] (220 bytes => 220 (0xDC))
0000 - 16 03 03 00 d7 0c 00 00-d3 03 00 17 41 04 5a 06   ............A.Z.
[...]
write to 0x556d44ced1e0 [0x556d44d05120] (9 bytes => 9 (0x9))
0000 - 16 03 03 00 04 0e 00 00-00                        .........
read from 0x556d44ced1e0 [0x556d44cf61a3] (5 bytes => 5 (0x5))
0000 - 16 03 03 00 46                                    ....F
read from 0x556d44ced1e0 [0x556d44cf61a8] (70 bytes => 70 (0x46))
0000 - 10 00 00 42 41 04 c3 ce-7a a8 53 76 28 fc 55 c5   ...BA...z.Sv(.U.
[...]
0040 - 6b c7 1a 5e f5 0e                                 k..^..
read from 0x556d44ced1e0 [0x556d44cf61a3] (5 bytes => 5 (0x5))
0000 - 14 03 03 00 01                                    .....
read from 0x556d44ced1e0 [0x556d44cf61a8] (1 bytes => 1 (0x1))
0000 - 01                                                .
read from 0x556d44ced1e0 [0x556d44cf61a3] (5 bytes => 5 (0x5))
0000 - 16 03 03 00 28                                    ....(
read from 0x556d44ced1e0 [0x556d44cf61a8] (40 bytes => 40 (0x28))
0000 - 77 07 27 75 71 54 a9 bc-89 2f 69 df 45 6a 6c d8   w.'uqT.../i.Ejl.
[...]
write to 0x556d44ced1e0 [0x556d44d05120] (6 bytes => 6 (0x6))
0000 - 14 03 03 00 01 01                                 ......
write to 0x556d44ced1e0 [0x556d44d05120] (45 bytes => 45 (0x2D))
0000 - 16 03 03 00 28 78 f8 92-c1 cd d0 73 6b 72 6e 4c   ....(x.....skrnL
[...]
read from 0x556d44ced1e0 [0x556d44cf61a3] (5 bytes => 5 (0x5))
0000 - 17 03 03 00 6d                                    ....m
read from 0x556d44ced1e0 [0x556d44cf61a8] (109 bytes => 109 (0x6D))
0000 - 77 07 27 75 71 54 a9 bd-0c 8f e3 9c f3 90 35 a1   w.'uqT........5.
[...]
FILE:demo.html
write to 0x556d44ced1e0 [0x556d44cffc53] (117 bytes => 117 (0x75))
0000 - 17 03 03 00 70 78 f8 92-c1 cd d0 73 6c 14 de 14   ....px.....sl...
[...]
ACCEPT

恭喜!您已经成功设置并测试 PQC 容器化工具包环境。您随时可以尝试创建证书和建立量子安全的连接。