4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OpenSSLを使ってPQC(Post-Quantum Cryptography)対応の自己署名証明書を作成する方法

Last updated at Posted at 2025-12-02

この記事はAIによって生成されたコンテンツを含みます。(スクショ、コマンド出力、ログ、トレースなどには含みません)

はじめに

量子コンピューターの進化により、従来の公開鍵暗号(RSAやECDSAなど)が将来的に破られる可能性が現実味を帯びてきました。量子コンピューターの脅威に備えるため、耐量子暗号(Post-Quantum Cryptography, PQC)の導入が現実的な課題になりつつあります。

Open Quantum Safe (OQS) プロジェクトは、耐量子暗号の実装と普及を目指すオープンソースプロジェクトであり、TLSなどの主要プロトコルにPQCを組み込むためのツール群を提供しています。一般的なOpenSSLリリースは従来のアルゴリズムにのみ対応しているため、PQC対応にはOQSのoqs-providerやliboqsを利用する必要があります。

本記事では、OQSが提供するDockerイメージ openquantumsafe/oqs-ossl3 を使用して、さまざまな署名アルゴリズムの自己署名証明書を作成する手順をご紹介します。

トップに戻る

OQS oqs-ossl3 Dockerイメージの概要

openquantumsafe/oqs-ossl3 は、Open Quantum Safeプロジェクトが提供する公式Dockerイメージで、OpenSSL 3 + oqs-provider + liboqs を統合した、量子安全暗号対応のオールインワン環境です。

  • 量子安全暗号対応のOpenSSL 3
    Kyber、Dilithium、Falconなど、NIST PQC候補アルゴリズムをサポートしています。

  • ハイブリッド暗号も可能
    RSAやECCとPQCを組み合わせた証明書生成も可能です。

  • 証明書発行・TLSテストが容易
    通常のOpenSSLコマンドで、PQC証明書やTLS 1.3ハンドシェイクを試すことができます。

トップに戻る

具体的な自己署名証明書の発行方法

事前準備

(呼び出し時に存在しなければ自動的にpullされますが) 事前準備として、Dockerイメージを取得しておきます。

docker pull openquantumsafe/oqs-ossl3:latest

以下のコマンドで作業用ディレクトリーを作成します。

mkdir -p ~/pqc-certs && cd ~/pqc-certs

このフォルダーに、後述の openssl.cnf を保存します。鍵や証明書もここに作成されます。

トップに戻る

openssl.cnfの作成

以下を参考にopenssl.cnfを作成します。

# ---- req セクション: CSR/自己署名証明書の入力設定 ----
[ req ]
default_bits        = 3072
distinguished_name  = req_distinguished_name
req_extensions      = v3_req
prompt              = no

# ---- サブジェクト(固定値)----
[ req_distinguished_name ]
C   = JP
ST  = Osaka
L   = Osaka
O   = QuantumSafe Sample Org
OU  = PQC Lab
CN  = sample.qs.local

# ---- リーフ証明書の拡張例(サーバー/クライアント用途)----
[ v3_req ]
basicConstraints    = CA:FALSE
keyUsage            = digitalSignature, keyEncipherment
extendedKeyUsage    = serverAuth, clientAuth
subjectAltName      = @alt_names

[ alt_names ]
DNS.1 = sample.qs.local
DNS.2 = www.sample.qs.local

トップに戻る

自己署名証明書の生成

以下のコマンドでは、すべて -config /work/openssl.cnf -extensions v3_req を指定し、拡張は openssl.cnf の v3_req を適用します。また、-days 365 を指定しているため、有効期間は 1 年です。

コンテナーは使い捨て(--rm)とし、先ほど作成したフォルダーに鍵と証明書が保管されます。

生成する証明書の署名アルゴリズムの選択は、参考文献にある Cybertrust Japan さんのページのリストに従っています。

トップに戻る

従来暗号

RSA(sha256WithRSAEncryption)

docker run --rm -v "$(pwd)":/work openquantumsafe/oqs-ossl3 \
  openssl req -x509 -new -newkey rsa:2048 \
    -keyout /work/rsa.key -out /work/rsa.crt \
    -days 365 -nodes \
    -config /work/openssl.cnf -extensions v3_req

ECDSA(ecdsa-with-SHA256)

docker run --rm -v "$(pwd)":/work openquantumsafe/oqs-ossl3 \
  openssl req -x509 -new -newkey ec -pkeyopt ec_paramgen_curve:P-256 \
    -keyout /work/ecdsa.key -out /work/ecdsa.crt \
    -days 365 -nodes \
    -config /work/openssl.cnf -extensions v3_req

トップに戻る

PQC(ML-DSA/Falcon)

ML-DSA44 / ML-DSA65 / ML-DSA87

# ML-DSA44
docker run --rm -v "$(pwd)":/work openquantumsafe/oqs-ossl3 \
  openssl req -x509 -new -newkey mldsa44 \
    -keyout /work/mldsa44.key -out /work/mldsa44.crt \
    -days 365 -nodes \
    -config /work/openssl.cnf -extensions v3_req

# ML-DSA65
docker run --rm -v "$(pwd)":/work openquantumsafe/oqs-ossl3 \
  openssl req -x509 -new -newkey mldsa65 \
    -keyout /work/mldsa65.key -out /work/mldsa65.crt \
    -days 365 -nodes \
    -config /work/openssl.cnf -extensions v3_req

# ML-DSA87
docker run --rm -v "$(pwd)":/work openquantumsafe/oqs-ossl3 \
  openssl req -x509 -new -newkey mldsa87 \
    -keyout /work/mldsa87.key -out /work/mldsa87.crt \
    -days 365 -nodes \
    -config /work/openssl.cnf -extensions v3_req

Falcon512 / Falcon1024

# Falcon512
docker run --rm -v "$(pwd)":/work openquantumsafe/oqs-ossl3 \
  openssl req -x509 -new -newkey falcon512 \
    -keyout /work/falcon512.key -out /work/falcon512.crt \
    -days 365 -nodes \
    -config /work/openssl.cnf -extensions v3_req

# Falcon1024
docker run --rm -v "$(pwd)":/work openquantumsafe/oqs-ossl3 \
  openssl req -x509 -new -newkey falcon1024 \
    -keyout /work/falcon1024.key -out /work/falcon1024.crt \
    -days 365 -nodes \
    -config /work/openssl.cnf -extensions v3_req

トップに戻る

ハイブリッド(従来 + PQC)

rsa3072_ML-DSA44 / rsa3072_falcon512

# RSA3072 + ML-DSA44
docker run --rm -v "$(pwd)":/work openquantumsafe/oqs-ossl3 \
  openssl req -x509 -new -newkey rsa3072_mldsa44 \
    -keyout /work/rsa3072_mldsa44.key -out /work/rsa3072_mldsa44.crt \
    -days 365 -nodes \
    -config /work/openssl.cnf -extensions v3_req

# RSA3072 + Falcon512
docker run --rm -v "$(pwd)":/work openquantumsafe/oqs-ossl3 \
  openssl req -x509 -new -newkey rsa3072_falcon512 \
    -keyout /work/rsa3072_falcon512.key -out /work/rsa3072_falcon512.crt \
    -days 365 -nodes \
    -config /work/openssl.cnf -extensions v3_req

p384_ML-DSA65 / p521_ML-DSA87

# P-384 + ML-DSA65
docker run --rm -v "$(pwd)":/work openquantumsafe/oqs-ossl3 \
  openssl req -x509 -new -newkey p384_mldsa65 \
    -keyout /work/p384_mldsa65.key -out /work/p384_mldsa65.crt \
    -days 365 -nodes \
    -config /work/openssl.cnf -extensions v3_req

# P-521 + ML-DSA87
docker run --rm -v "$(pwd)":/work openquantumsafe/oqs-ossl3 \
  openssl req -x509 -new -newkey p521_mldsa87 \
    -keyout /work/p521_mldsa87.key -out /work/p521_mldsa87.crt \
    -days 365 -nodes \
    -config /work/openssl.cnf -extensions v3_req

p256_falcon512 / p521_falcon1024

# P-256 + Falcon512
docker run --rm -v "$(pwd)":/work openquantumsafe/oqs-ossl3 \
  openssl req -x509 -new -newkey p256_falcon512 \
    -keyout /work/p256_falcon512.key -out /work/p256_falcon512.crt \
    -days 365 -nodes \
    -config /work/openssl.cnf -extensions v3_req

# P-521 + Falcon1024
docker run --rm -v "$(pwd)":/work openquantumsafe/oqs-ossl3 \
  openssl req -x509 -new -newkey p521_falcon1024 \
    -keyout /work/p521_falcon1024.key -out /work/p521_falcon1024.crt \
    -days 365 -nodes \
    -config /work/openssl.cnf -extensions v3_req

トップに戻る

生成された証明書の確認

上記のすべてのコマンドを実行すると、~/pqc-certs フォルダーには以下のファイルが作成されています。

-rw-r--r-- 1 root    root       928 12月  1 17:48 ecdsa.crt
-rw------- 1 root    root       241 12月  1 17:48 ecdsa.key
-rw-r--r-- 1 root    root      4881 12月  1 17:40 falcon1024.crt
-rw------- 1 root    root      5636 12月  1 17:40 falcon1024.key
-rw-r--r-- 1 root    root      2829 12月  1 17:40 falcon512.crt
-rw------- 1 root    root      3036 12月  1 17:40 falcon512.key
-rw-r--r-- 1 root    root      5799 12月  1 17:39 mldsa44.crt
-rw------- 1 root    root      5336 12月  1 17:39 mldsa44.key
-rw-r--r-- 1 root    root      7871 12月  1 17:39 mldsa65.crt
-rw------- 1 root    root      8196 12月  1 17:39 mldsa65.key
-rw-r--r-- 1 root    root     10519 12月  1 17:39 mldsa87.crt
-rw------- 1 root    root     10235 12月  1 17:39 mldsa87.key
-rw-r--r-- 1 khirazo khirazo    708 12月  1 17:27 openssl.cnf
-rw-r--r-- 1 root    root      3024 12月  1 17:41 p256_falcon512.crt
-rw------- 1 root    root      3207 12月  1 17:41 p256_falcon512.key
-rw-r--r-- 1 root    root      8135 12月  1 17:40 p384_mldsa65.crt
-rw------- 1 root    root      8423 12月  1 17:40 p384_mldsa65.key
-rw-r--r-- 1 root    root      5254 12月  1 17:41 p521_falcon1024.crt
-rw------- 1 root    root      5945 12月  1 17:41 p521_falcon1024.key
-rw-r--r-- 1 root    root     10885 12月  1 17:40 p521_mldsa87.crt
-rw------- 1 root    root     10536 12月  1 17:40 p521_mldsa87.key
-rw-r--r-- 1 root    root      1464 12月  1 17:38 rsa.crt
-rw------- 1 root    root      1704 12月  1 17:38 rsa.key
-rw-r--r-- 1 root    root      3898 12月  1 17:40 rsa3072_falcon512.crt
-rw------- 1 root    root      5437 12月  1 17:40 rsa3072_falcon512.key
-rw-r--r-- 1 root    root      6851 12月  1 17:40 rsa3072_mldsa44.crt
-rw------- 1 root    root      7729 12月  1 17:40 rsa3072_mldsa44.key

トップに戻る


証明書が期待通りに生成されたかを確認してみます。

openssl x509 コマンドの出力

証明書のアルゴリズムや有効期限、拡張情報などを確認するには、openssl x509 コマンドを使います。

例として、p256_falcon512を表示してみます。

openssl x509 -in p256_falcon512.crt -text -noout

以下が出力結果です。

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            37:b9:17:04:c3:aa:6c:3c:d0:f1:25:84:94:87:f2:1f:77:61:42:f1
        Signature Algorithm: p256_falcon512
        Issuer: C = JP, ST = Osaka, L = Osaka, O = QuantumSafe Sample Org, OU = PQC Lab, CN = sample.qs.local
        Validity
            Not Before: Dec  1 08:41:06 2025 GMT
            Not After : Dec  1 08:41:06 2026 GMT
        Subject: C = JP, ST = Osaka, L = Osaka, O = QuantumSafe Sample Org, OU = PQC Lab, CN = sample.qs.local
        Subject Public Key Info:
            Public Key Algorithm: p256_falcon512
                p256_falcon512 hybrid public key:
                prime256v1 key material:
                    04:34:a6:ad:6e:bd:88:fd:af:04:3f:9a:a0:7b:ed:
                    e3:e0:9c:46:ce:54:0e:bc:40:46:4c:97:3e:60:c8:
                    68:9d:d0:21:f7:e0:96:96:c5:e2:55:b3:25:10:a3:
                    f9:9e:2e:d5:e9:44:2b:3e:5f:64:89:7c:70:89:39:
                    c4:d6:cf:fc:f5
                PQ key material:
                    09:0e:de:3c:94:5f:8d:c1:79:51:fe:34:dd:e5:9f:
                    6e:18:bb:67:3b:6c:b7:9d:1e:de:58:a1:2c:27:1f:
                    ae:1f:2b:cb:46:0c:42:ca:5d:4b:4a:6c:58:9e:c4:
                    a7:09:e2:e2:dc:b0:c5:2c:a8:09:dc:7d:bc:bc:1c:
                    79:4e:de:ee:8b:79:54:78:e8:23:42:1c:ea:a6:b8:
                    8d:a4:a0:50:58:4d:91:5c:5c:3a:15:86:c2:27:4c:
                    ac:0d:a8:55:01:49:f5:a3:67:a3:72:42:da:2e:65:
                    47:96:58:05:c5:08:50:82:22:b9:87:b0:ca:a0:1b:
                    a9:76:45:74:d9:91:3b:bd:26:1e:f4:3d:59:96:5d:
                    f9:01:a4:d4:de:b2:89:38:28:d1:16:c6:fe:6b:71:
                    03:33:40:d1:27:b1:c4:f0:16:24:ca:ad:85:6d:ea:
                    72:71:86:01:67:4e:db:d0:04:c1:c2:73:32:02:db:
                    d0:8b:6b:5f:82:57:1b:d5:df:fd:13:95:85:e8:7d:
                    07:42:46:a1:47:39:ee:ed:f3:48:81:2b:0b:12:08:
                    9a:87:28:bc:80:04:95:db:50:ca:0f:14:2b:9b:f9:
                    48:8a:11:7a:ea:25:9e:6b:e0:93:57:c5:1d:9b:3a:
                    4a:6d:08:72:6e:c6:b1:7a:02:c3:e3:66:56:8f:5c:
                    86:d1:d3:af:1d:94:c5:db:33:b4:12:81:76:16:f0:
                    c9:fb:68:50:0c:4e:ab:45:27:c6:a9:b3:76:b5:80:
                    0a:dc:bf:2d:d0:e6:a7:ce:d0:b9:38:34:ff:ca:5d:
                    81:6e:67:36:3e:8a:1b:a6:7b:21:c6:a6:e7:f7:50:
                    cf:ae:88:7e:14:1e:0c:37:99:7d:01:e6:41:55:eb:
                    04:0e:73:60:c8:20:90:a1:a8:a8:15:25:de:54:68:
                    f1:2c:80:a3:56:f6:bc:86:db:e6:d8:6a:29:8f:c9:
                    8a:33:75:98:4d:7b:2a:4d:b1:49:48:0d:4a:8e:98:
                    a0:1c:a3:4f:3b:90:3a:65:1b:93:df:4e:79:fd:cb:
                    5d:9c:3f:76:4c:07:3a:5b:45:b9:9f:54:ba:fa:fa:
                    5b:f0:83:94:0d:e2:56:ed:e8:7c:aa:de:83:0b:58:
                    8a:b9:e6:57:c7:fe:e9:68:b6:a6:6d:d7:84:18:e9:
                    13:7c:08:d9:13:df:96:a9:ca:9a:44:11:eb:3e:60:
                    86:a6:e2:dd:47:92:09:a8:36:04:11:ea:22:49:38:
                    83:42:5d:c2:a2:7f:34:73:46:68:0e:d1:7e:e5:15:
                    27:7c:8f:b1:0d:05:a3:70:78:16:58:18:1e:c5:a4:
                    87:ad:cd:2c:12:0c:e0:bd:45:c3:af:f2:0d:59:1c:
                    44:02:a9:d0:70:a3:7f:6d:05:65:01:4a:17:92:cd:
                    3f:56:79:8b:fb:e9:08:9a:75:30:2c:85:2b:94:f1:
                    2f:24:eb:11:f9:59:f7:81:66:4b:15:16:65:13:18:
                    3a:f5:44:78:46:9f:7d:ea:3e:a3:f4:91:7d:6e:1a:
                    35:05:61:8f:90:27:61:d8:44:80:4f:f6:92:9a:93:
                    50:23:ef:04:a7:f5:c7:16:19:2b:27:08:8e:e2:86:
                    ae:29:ca:98:41:8c:51:2d:99:bc:0b:62:b8:05:9b:
                    9a:3b:8f:c1:40:32:50:a2:45:28:ac:a5:9b:51:8d:
                    ce:1c:6a:96:fa:c6:98:7f:84:36:34:98:e4:6f:ca:
                    64:0e:22:0a:c2:d1:ba:75:2d:45:34:6e:66:f5:05:
                    1d:16:89:76:aa:b5:ae:30:1c:05:67:cb:6f:0e:c6:
                    ca:51:9f:95:08:22:fc:c2:21:2f:2c:86:20:c6:c2:
                    50:09:53:ca:a5:f4:39:80:89:1c:68:50:05:1c:4b:
                    79:9b:4f:5e:66:6f:3b:3c:a5:57:b1:a8:85:3a:6a:
                    e6:8c:34:e0:7d:62:a1:54:f4:9b:e8:71:1b:be:28:
                    ea:0e:16:26:d0:28:42:84:00:04:29:9b:4a:40:e2:
                    06:79:cc:ba:cd:26:f1:4e:42:5e:c7:99:64:67:85:
                    41:49:ca:22:d4:d1:89:2d:4a:3a:43:19:22:a2:79:
                    01:f0:3c:5b:b3:49:a0:a6:59:4f:08:c1:4f:f9:c1:
                    84:dc:a0:0c:10:c8:af:66:8e:c8:04:8a:39:a8:00:
                    83:a5:f1:25:61:8a:a3:44:01:ca:a0:8d:81:d4:00:
                    06:de:75:7a:26:04:5e:22:1b:55:02:22:49:57:e2:
                    b9:80:10:02:28:74:52:d2:2e:0a:f6:2b:f2:45:bc:
                    3d:b8:35:c8:29:cc:98:7e:94:12:cb:f2:09:4d:41:
                    a4:a7:f3:65:c0:80:5d:b9:2a:58:40:95:e5:28:e5:
                    d4:f4:2c:65:29:57:8e:20:e4:2d:ad:9c
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            X509v3 Key Usage:
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage:
                TLS Web Server Authentication, TLS Web Client Authentication
            X509v3 Subject Alternative Name:
                DNS:sample.qs.local, DNS:www.sample.qs.local
            X509v3 Subject Key Identifier:
                EF:73:77:74:9F:C7:48:5E:FD:E2:05:EA:DC:57:53:BA:32:B5:AE:0F
    Signature Algorithm: p256_falcon512
    Signature Value:
        00:00:00:48:30:46:02:21:00:ca:9e:f4:c3:99:1c:51:bb:4e:
        25:ed:16:07:9e:c2:a7:5f:26:15:55:24:fc:45:e6:45:95:70:
        a7:54:9d:93:dc:02:21:00:cd:86:80:98:f4:6d:a6:fe:da:de:
        41:11:1f:c6:02:a6:cf:d1:b2:c4:b9:b9:1f:6c:24:05:4c:87:
        36:aa:62:9e:39:8b:3a:6e:bb:51:4b:03:a2:92:7b:b3:72:c8:
        43:54:a0:da:3f:0a:be:fd:be:06:8c:be:5f:f9:6e:d5:1b:69:
        ce:3e:2b:94:9d:3c:35:b2:3f:e6:28:bb:9c:eb:0c:5f:52:f5:
        aa:d5:12:60:08:24:5e:1f:ee:ef:22:ec:73:1f:33:f5:e4:61:
        0a:11:5e:b0:ae:f2:da:66:84:df:c4:50:45:a6:53:4b:71:32:
        bc:7a:21:77:6d:5b:39:d4:eb:ca:c1:f5:4d:2c:ae:b1:f5:22:
        47:f7:8b:f8:84:18:e6:89:00:d9:c8:97:5c:53:4b:11:67:23:
        f5:bf:0d:c7:28:bc:63:25:f2:9a:ca:66:aa:63:2a:8d:19:05:
        e4:39:ae:3d:39:ac:91:b5:dc:27:39:bb:8b:20:f9:b7:7f:8b:
        aa:7b:58:ef:5c:9d:91:40:12:9d:e1:14:b0:a7:aa:54:81:05:
        f9:45:e0:19:74:56:0f:b3:88:d2:21:95:1d:f3:8e:ca:6f:38:
        14:93:7c:d5:2f:55:28:7d:9f:a7:47:c8:b0:28:85:96:0f:1d:
        46:3d:19:a3:d7:a2:79:1d:47:df:10:40:e7:68:51:86:b6:b1:
        b4:9f:be:0c:70:ad:f6:4e:b6:83:b7:a1:e9:f1:1c:a4:5b:02:
        9f:51:ba:d3:d2:29:6f:f4:ca:58:53:68:ac:9c:ec:3d:2a:e3:
        48:dc:9a:83:9b:b6:3e:b4:88:64:c5:49:f2:a4:75:58:96:26:
        f9:7d:dc:49:64:7c:1e:db:07:c4:79:17:76:e9:2d:64:14:09:
        49:05:c2:39:ca:c5:8e:c1:cd:50:8e:9e:ed:96:5a:9d:ba:d1:
        37:31:e9:23:95:88:89:15:c7:55:f4:63:cd:bb:47:93:a0:16:
        4d:5a:fd:57:2d:0c:1a:c9:17:8b:6c:16:ea:cb:29:8f:18:58:
        b2:c0:84:18:36:4c:76:d2:2e:de:7a:0a:91:e1:df:d9:dc:27:
        24:d4:a8:8c:2a:e7:65:ac:7c:e9:be:8c:14:bb:19:69:d8:b4:
        dc:fd:8d:f6:e7:4d:c7:a5:34:85:f3:90:e8:4a:70:70:1a:ae:
        e2:76:58:de:fd:52:db:d0:ce:fa:53:11:e8:da:d3:d0:7f:7b:
        00:6d:30:b8:12:bc:af:ea:b5:f9:64:d5:4a:cd:ea:71:9a:a9:
        ef:a7:f1:ae:84:20:e8:ff:47:16:e5:42:7a:59:23:a4:80:e2:
        f2:ea:f4:ca:ae:7a:ea:71:ee:35:de:da:a6:71:1c:0f:b6:c6:
        0b:9c:ef:ac:06:0f:32:b0:70:2d:df:2a:02:ca:cc:98:36:81:
        0e:60:ac:58:78:ce:84:e7:f9:31:0a:12:08:c6:bb:b0:3a:13:
        b5:f0:ad:63:53:36:a3:cd:de:86:1c:49:29:aa:20:2c:71:89:
        d8:63:d3:ec:25:37:b8:6c:aa:d2:98:0b:4b:fb:9d:2a:2c:03:
        27:e8:dd:61:b3:34:ef:14:5e:92:cf:7b:f3:59:33:23:21:91:
        3a:6f:9a:64:f2:3c:39:35:02:36:b2:2f:b1:0a:03:9a:f6:c0:
        56:f4:02:4a:96:5a:46:3a:97:9e:7d:e3:7f:6e:b2:b1:71:b7:
        ac:65:1d:35:d5:b7:85:b9:b0:b0:cf:4b:62:07:31:26:fa:13:
        74:83:44:a3:b9:1c:d3:fc:e8:f4:e0:5b:59:dd:5f:30:40:19:
        37:93:7b:1d:77:e8:64:9a

トップに戻る

商用製品による可視化

以下は、別の証明書「rsa3072_mldsa44」について、IBMの商用製品である Guardium Cryptography Manager にインポートして可視化した例です。

image001.png

証明書として認識され、有効期間などの各フィールドが取得されていることがわかります。

トップに戻る

TLSサーバーでの通信確認

最後に、生成された鍵と証明書を使って、実際のTLSが機能することを確認してみましょう。

現時点では一般のWebサーバーやブラウザーを使用して動作確認をすることは難しいため、再び openquantumsafe/oqs-ossl3 イメージを使用します。

サーバーの起動

今回の例として、ML-DSA44証明書を指定して起動します。

-cert で サーバー証明書を、-key で 秘密鍵を指定し、-accept 4433 で、ポート4433でLISTENさせます。-www オプションは、テストのための簡易的なHTTPレスポンスを返します。

docker run --rm -v $(pwd):/work -p 4433:4433 openquantumsafe/oqs-ossl3 \
  openssl s_server -cert /work/mldsa44.crt -key /work/mldsa44.key \
    -accept 4433 -www

トップに戻る

クライアントからの接続

試しに通常のブラウザーでアクセスしてみたところ、SSL_ERROR_NO_CYPHER_OVERLAP (Firefox) とERR_SSL_VERSION_OR_CIPHER_MISMATCH (Chrome) で失敗しました。

サーバー側にも以下のエラーが出ています。

287B022354760000:error:0A000065:SSL routines:final_key_share:no suitable key share:ssl/statem/extensions.c:1487:

そこで、サーバーと同様に openquantumsafe/oqs-ossl3 イメージを使用して、openssl s_client で接続してみます。(この環境ではDockerを自分のWSL環境で動作させているので、接続先は host.docker.internal です。OSによっては127.0.0.1 を指定する必要があるかもしれません)

docker run --rm openquantumsafe/oqs-ossl3 \
  openssl s_client -connect host.docker.internal:4433

以下が出力結果です。

CONNECTED(00000003)
Connecting to 10.88.0.1
depth=0 C=JP, ST=Osaka, L=Osaka, O=QuantumSafe Sample Org, OU=PQC Lab, CN=sample.qs.local
verify error:num=18:self-signed certificate
verify return:1
depth=0 C=JP, ST=Osaka, L=Osaka, O=QuantumSafe Sample Org, OU=PQC Lab, CN=sample.qs.local
verify return:1
---
Certificate chain
 0 s:C=JP, ST=Osaka, L=Osaka, O=QuantumSafe Sample Org, OU=PQC Lab, CN=sample.qs.local
   i:C=JP, ST=Osaka, L=Osaka, O=QuantumSafe Sample Org, OU=PQC Lab, CN=sample.qs.local
   a:PKEY: UNDEF, 128 (bit); sigalg: mldsa44
   v:NotBefore: Dec  1 08:39:40 2025 GMT; NotAfter: Dec  1 08:39:40 2026 GMT
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIQjTCCBwOgAwIBAgIUeHtyui0n6sBOWkn3vDKJ/ogm4QUwCwYJYIZIAWUDBAMR
MHoxCzAJBgNVBAYTAkpQMQ4wDAYDVQQIDAVPc2FrYTEOMAwGA1UEBwwFT3Nha2Ex
HzAdBgNVBAoMFlF1YW50dW1TYWZlIFNhbXBsZSBPcmcxEDAOBgNVBAsMB1BRQyBM
YWIxGDAWBgNVBAMMD3NhbXBsZS5xcy5sb2NhbDAeFw0yNTEyMDEwODM5NDBaFw0y
NjEyMDEwODM5NDBaMHoxCzAJBgNVBAYTAkpQMQ4wDAYDVQQIDAVPc2FrYTEOMAwG
A1UEBwwFT3Nha2ExHzAdBgNVBAoMFlF1YW50dW1TYWZlIFNhbXBsZSBPcmcxEDAO
BgNVBAsMB1BRQyBMYWIxGDAWBgNVBAMMD3NhbXBsZS5xcy5sb2NhbDCCBTIwCwYJ
YIZIAWUDBAMRA4IFIQCuWXXHHFGfqeD0bZYHkQuddqvhW0ALKjjudWVwJFKGXCp+
bQiZrrYtXvGPZWQFXhj6sKKRUxzTdMhaSBVlbbUPqFMfAxJALUr9CNrpwDXEjaVk
Pue25pG2fREEIvx5jqxRLG7IvCbfW859HEvWd+zQAbEs7+lEvOn+xgH1VFR8GE68
P772e8Ch+njVbszBQ9KdquuCOEO77K0w0E/6aT2r3f5h+JzP/Kg9C0X/O2S+zfyK
ehUtMD/UsUrFZbxQEmaoJ44SyLCvaxq4VSNcI2gcwJmgtthh+7vdYK9dCzWYlfeL
g9XuDluXotAqFReMLSEXi+CF45skt7PbbgwUH10VJOxF62Ihfj+4HZ2BEI1p/QrB
j1GBHVbldYm9+ERsWG+OnvCXFwyo8nVhJL98gqJdCEhhoQnonKGNiBBUFfaVeoQw
jM5q5KH6zJwrms5b7shRSJp/i09Z4UKhySNMgx5dnhA5So4K/pXSFgs+dD++9St7
A06F2w94ihL8JYUKRPbnuAwgoOfb+Qqws0j4isbPT+cUs+txlaNjbXQDp9c3wWbU
Sut7rrV5PLXjn82aSl9wwamLOUL1WSsm4ijZNlPL4UZ8tqbtvIZ1D3s12s4eRoAr
gYhEZQ6DVBU6K/o7LkEhWuuKRblqVok/CBKoNym0zfPLkGOGmJ/YFGy42CeTWHFu
FU+p7VkBo37vpSpZc/R7ZRW6/Qv43pQNJ5ESB6M0zAoU4lYzbFRnBW5nWq+JqaRD
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
AAAAAAAAAAAAAAAAABQkNUA=
-----END CERTIFICATE-----
subject=C=JP, ST=Osaka, L=Osaka, O=QuantumSafe Sample Org, OU=PQC Lab, CN=sample.qs.local
issuer=C=JP, ST=Osaka, L=Osaka, O=QuantumSafe Sample Org, OU=PQC Lab, CN=sample.qs.local
---
No client certificate CA names sent
Peer signature type: mldsa44
---
SSL handshake has read 8017 bytes and written 1651 bytes
Verification error: self-signed certificate
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Protocol: TLSv1.3
Server public key is 128 bit
This TLS version forbids renegotiation.
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 18 (self-signed certificate)
---
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
    Session-ID: 4310C4E5E6C8D2C92442E2BDBAFBCDF982003514074D8502A52A76F9B2F20E53
    Session-ID-ctx:
    Resumption PSK: E3321D81D719846B48976AC7892F8BF2833EDD421753A563148C7B5E98C95AE35555A5F316B192F83A37EB23208F49BC
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 7200 (seconds)
    TLS session ticket:
    0000 - 58 c5 9f 99 2f 37 cf 71-06 0f 87 7f a4 70 15 af   X.../7.q.....p..
    0010 - 82 e3 a1 2e 84 23 2a 17-32 ae 0b 4c 4b 34 52 68   .....#*.2..LK4Rh
    0020 - 70 0c 06 34 36 de 60 26-ef 54 4c 36 6e b9 d6 b3   p..46.`&.TL6n...
    0030 - ad 14 78 ed c1 7a a9 68-89 64 ea a4 97 a8 f2 43   ..x..z.h.d.....C
    0040 - 30 b2 92 13 60 9c 0f 18-a2 30 73 f1 21 10 c0 a6   0...`....0s.!...
    0050 - f8 ad 52 b1 18 48 44 30-ac c8 e4 4f 0f 39 c1 37   ..R..HD0...O.9.7
    0060 - 05 28 ac 83 51 84 1a b2-47 42 61 d7 55 9b 8c a1   .(..Q...GBa.U...
    0070 - 20 7c e0 b6 22 0e 77 21-23 8f 49 5f ce ce 3c 18    |..".w!#.I_..<.
    0080 - 34 2b f4 03 88 1f 54 20-8e 51 df 2d 25 14 58 a7   4+....T .Q.-%.X.
    0090 - d0 b7 b1 33 16 a1 9d a3-3e c3 6f 4b 90 1e a1 16   ...3....>.oK....
    00a0 - 97 31 44 84 20 69 eb 29-2a 48 53 9b 8d f7 13 cc   .1D. i.)*HS.....
    00b0 - ff 65 64 19 4e 9e b0 16-e4 8a c1 34 2d b8 c3 5b   .ed.N......4-..[
    00c0 - b4 11 92 cd 0f 9e 23 29-30 da b9 c6 c2 a7 59 6a   ......#)0.....Yj

    Start Time: 1764639804
    Timeout   : 7200 (sec)
    Verify return code: 18 (self-signed certificate)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
    Session-ID: C30FB0B97515E2ADCBBEBE56809599ED949AEC735E45CC3EC485B8FE499B5C78
    Session-ID-ctx:
    Resumption PSK: 1786E2E57CB15611C33F907AED3B63CC6881189FDDE6091657D305A59D78C94873FE7B252D62FBC1306D429B6A0C8DD7
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 7200 (seconds)
    TLS session ticket:
    0000 - 58 c5 9f 99 2f 37 cf 71-06 0f 87 7f a4 70 15 af   X.../7.q.....p..
    0010 - ba 26 ea bc 33 44 13 80-29 62 99 c3 4a 3f 59 8e   .&..3D..)b..J?Y.
    0020 - 16 e4 39 bb b7 0e dd f1-5a 91 18 35 89 9e f1 8b   ..9.....Z..5....
    0030 - 62 58 81 9f 4e a0 4d 87-06 3a 31 32 1f 6b fa 69   bX..N.M..:12.k.i
    0040 - 4c 8d 2c 6e c2 d9 87 b3-25 b5 a4 4e 2a 7a 3e 1d   L.,n....%..N*z>.
    0050 - 10 c6 01 38 34 28 b3 97-8c 82 1a 88 1d bf 22 47   ...84(........"G
    0060 - 96 47 eb 46 fa 84 dc 05-53 48 97 df 1f d5 eb 26   .G.F....SH.....&
    0070 - 7e b1 af f6 7a 29 82 2c-21 6a 0c 23 bd 31 1f 75   ~...z).,!j.#.1.u
    0080 - e3 80 3c e3 31 8e 66 d1-88 64 a6 fb f1 2a 67 eb   ..<.1.f..d...*g.
    0090 - 63 c2 da 62 88 67 c9 fb-07 5b 44 75 f1 87 68 3d   c..b.g...[Du..h=
    00a0 - 86 bc fe 83 e8 f7 cc 40-ae cc fc f2 79 f5 1b ab   .......@....y...
    00b0 - bf 57 c2 14 1f b4 e6 8b-ea f3 e6 55 a3 33 82 73   .W.........U.3.s
DONE
    00c0 - dd 33 39 e0 27 dc 7d 1f-24 e1 81 eb 09 56 44 bb   .39.'.}.$....VD.

    Start Time: 1764639804
    Timeout   : 7200 (sec)
    Verify return code: 18 (self-signed certificate)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK

なぜか私の環境ではサーバーをCtrl-Cで止めることができず、別の端末からdocker stopコマンドで止めました。

トップに戻る

まとめ

本記事では、OQS の oqs-ossl3 Docker イメージを活用し、OpenSSLでPQC対応の自己署名証明書を簡単に生成する方法を紹介しました。

従来のRSAやECDSAに加え、ML-DSA や Falcon といったポスト量子暗号、さらにハイブリッド証明書の作成まで、すべてDocker上で試すことができます。

openssl.cnf を使った設定や、生成した証明書の確認、TLSサーバーでの動作検証も含め、量子耐性のある暗号技術を実際に試すことで、今後のセキュリティー対策の理解を深めることができます。ぜひご自身の環境で体験してみてください。

トップに戻る

参考文献

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?