これは日々の作業を通して学んだことや毎日の生活で気づいたことをを記録しておく備忘録である。
HTML ファイル生成日時: 2024/11/21 17:40:55.112 (台灣標準時)
TLS 1.3 に準拠した HTTPS サーバーのための秘密鍵と証明書を作る方法を記 録しておくでござる。
まず、 openssl をインストールするでござる。 NetBSD の場合には、 pkgsrc を使えば簡単に openssl のインストールを行うことができるでござる。
# cd /usr/pkgsrc/security/openssl # make install
pkgsrc-2024Q2 だと、 openssl のバージョンは以下の通りでござる。
# /usr/pkg/bin/openssl -v OpenSSL 3.3.1 4 Jun 2024 (Library: OpenSSL 3.3.1 4 Jun 2024)
秘密鍵を作成するには、例えば、以下のようにすればよいでござる。 -algorithm オプションで公開鍵暗号の種類を選択するでござる。 algorithm には、 RSA, RSA-PSS, EC, X25519, X448, ED25519, ED448 のいずれかを選べ るようでござる。ただし、 Apache ですべてが使えるわけではないようでござ る。また、秘密鍵を暗号化するための暗号を指定する必要があるでござる。例 えば、 -aes-256-cbc や -aes-256-cfb などが使えるでござる。ここでは、試 験的に helloworld というパスワードを使っているでござる。
# cd /tmp # /usr/pkg/bin/openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out server.key -aes-256-cfb -pass pass:helloworld
利用できる暗号の一覧を得るためには、以下のようにすればよいようでござる。
% openssl enc -list Supported ciphers: -aes-128-cbc -aes-128-cfb -aes-128-cfb1 -aes-128-cfb8 -aes-128-ctr -aes-128-ecb -aes-128-ofb -aes-192-cbc -aes-192-cfb -aes-192-cfb1 -aes-192-cfb8 -aes-192-ctr -aes-192-ecb -aes-192-ofb -aes-256-cbc -aes-256-cfb -aes-256-cfb1 -aes-256-cfb8 -aes-256-ctr -aes-256-ecb -aes-256-ofb -aes128 -aes128-wrap -aes128-wrap-pad -aes192 -aes192-wrap -aes192-wrap-pad -aes256 -aes256-wrap -aes256-wrap-pad -aria-128-cbc -aria-128-cfb -aria-128-cfb1 -aria-128-cfb8 -aria-128-ctr -aria-128-ecb -aria-128-ofb -aria-192-cbc -aria-192-cfb -aria-192-cfb1 -aria-192-cfb8 -aria-192-ctr -aria-192-ecb -aria-192-ofb -aria-256-cbc -aria-256-cfb -aria-256-cfb1 -aria-256-cfb8 -aria-256-ctr -aria-256-ecb -aria-256-ofb -aria128 -aria192 -aria256 -bf -bf-cbc -bf-cfb -bf-ecb -bf-ofb -blowfish -camellia-128-cbc -camellia-128-cfb -camellia-128-cfb1 -camellia-128-cfb8 -camellia-128-ctr -camellia-128-ecb -camellia-128-ofb -camellia-192-cbc -camellia-192-cfb -camellia-192-cfb1 -camellia-192-cfb8 -camellia-192-ctr -camellia-192-ecb -camellia-192-ofb -camellia-256-cbc -camellia-256-cfb -camellia-256-cfb1 -camellia-256-cfb8 -camellia-256-ctr -camellia-256-ecb -camellia-256-ofb -camellia128 -camellia192 -camellia256 -cast -cast-cbc -cast5-cbc -cast5-cfb -cast5-ecb -cast5-ofb -chacha20 -des -des-cbc -des-cfb -des-cfb1 -des-cfb8 -des-ecb -des-ede -des-ede-cbc -des-ede-cfb -des-ede-ecb -des-ede-ofb -des-ede3 -des-ede3-cbc -des-ede3-cfb -des-ede3-cfb1 -des-ede3-cfb8 -des-ede3-ecb -des-ede3-ofb -des-ofb -des3 -des3-wrap -desx -desx-cbc -id-aes128-wrap -id-aes128-wrap-pad -id-aes192-wrap -id-aes192-wrap-pad -id-aes256-wrap -id-aes256-wrap-pad -id-smime-alg-CMS3DESwrap -idea -idea-cbc -idea-cfb -idea-ecb -idea-ofb -rc2 -rc2-128 -rc2-40 -rc2-40-cbc -rc2-64 -rc2-64-cbc -rc2-cbc -rc2-cfb -rc2-ecb -rc2-ofb -rc4 -rc4-40 -seed -seed-cbc -seed-cfb -seed-ecb -seed-ofb -sm4 -sm4-cbc -sm4-cfb -sm4-ctr -sm4-ecb -sm4-ofb
cbc, cfb, ctr, ecb, ofb などは何のことでござろうか、と思い、調べてみた ところ、以下のような説明があったでござる。
ただ、 openssl では、すべての組み合わせで利用できるわけではないようで ござる。以下に、秘密鍵が生成できる組み合わせと、できない組み合わせにつ いての情報があったでござる。
実際に試してみたところ、AES 256 の場合、 aes-256-cbc, aes-256-cfb, aes-256-cfb1, aes-256-cfb8, aes-256-ecb, aes-256-ofb では、秘密鍵を生 成することができたでござる。 aes-256-ctr では、エラーが生じて、秘密鍵 が生成できなかったでござる。また、 chacha20 でも失敗するようでござる。EC curve については、 P-256 と P-384 が使えるようでござる。 P-512 では うまくいかなかったでござる。
作成された秘密鍵は、ここでは server.key というファイルに入っているでご ざる。中身を見てみるでござる。
# /usr/pkg/bin/openssl pkey -noout -text -in server.key -passin pass:helloworld Private-Key: (256 bit) priv: 99:cd:a4:b1:0c:52:87:5d:5c:c0:ee:ab:f2:7b:1c: 3f:64:5c:1c:3e:41:74:11:75:7c:2b:7a:b7:a8:46: fa:32 pub: 04:58:86:22:03:6a:d4:25:e7:b7:c3:e4:1b:66:e2: ba:37:ff:fd:52:5b:7a:99:78:f7:01:57:5e:fd:21: 47:0a:21:9b:fc:64:f8:41:20:ea:0f:66:da:a3:9b: c3:5f:7e:14:29:3a:da:9f:0d:e6:8c:f5:f2:0d:ce: 33:e9:a7:76:b5 ASN1 OID: prime256v1 NIST CURVE: P-256
秘密鍵を使って自分自身で署名した証明書を作るでござる。
# /usr/pkg/bin/openssl req -new -x509 -noenc -sha384 -days 365 -key server.key -out server.crt -extensions usr_cert -passin pass:helloworld You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:TW State or Province Name (full name) [Some-State]:Taoyuan Locality Name (eg, city) []:Jhongli Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyOrganisation Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []:MyName Email Address []:MyEmail
ハッシュのアルゴリズムを指定する必要があるのでござるが、使うことのでき るハッシュのアルゴリズムの一覧は以下のようにして得られるようでござる。
% openssl dgst -list Supported digests: -blake2b512 -blake2s256 -md4 -md5 -md5-sha1 -mdc2 -ripemd -ripemd160 -rmd160 -sha1 -sha224 -sha256 -sha3-224 -sha3-256 -sha3-384 -sha3-512 -sha384 -sha512 -sha512-224 -sha512-256 -shake128 -shake256 -sm3 -ssl3-md5 -ssl3-sha1 -whirlpool
作った証明書を確認してみるでござる。証明書は server.crt というファイル に格納されているでござる。
# /usr/pkg/bin/openssl x509 -noout -text -in server.crt Certificate: Data: Version: 3 (0x2) Serial Number: 45:7b:a2:2e:d9:25:48:99:7a:34:30:f2:d8:92:49:e5:6a:1e:e0:2e Signature Algorithm: ecdsa-with-SHA384 Issuer: C=TW, ST=Taoyuan, L=Jhongli, O=MyOrganisation, CN=MyName, emailAddress=MyEmail Validity Not Before: Aug 17 04:05:32 2024 GMT Not After : Aug 17 04:05:32 2025 GMT Subject: C=TW, ST=Taoyuan, L=Jhongli, O=MyOrganisation, CN=MyName, emailAddress=MyEmail Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) pub: 04:58:86:22:03:6a:d4:25:e7:b7:c3:e4:1b:66:e2: ba:37:ff:fd:52:5b:7a:99:78:f7:01:57:5e:fd:21: 47:0a:21:9b:fc:64:f8:41:20:ea:0f:66:da:a3:9b: c3:5f:7e:14:29:3a:da:9f:0d:e6:8c:f5:f2:0d:ce: 33:e9:a7:76:b5 ASN1 OID: prime256v1 NIST CURVE: P-256 X509v3 extensions: X509v3 Basic Constraints: CA:FALSE X509v3 Subject Key Identifier: F0:98:C7:29:B4:A2:20:D8:9B:1F:01:9A:47:DE:57:2A:3D:AE:8C:AD Signature Algorithm: ecdsa-with-SHA384 Signature Value: 30:46:02:21:00:c2:46:78:55:87:26:69:58:63:32:b8:01:a7: 35:31:7d:29:fa:35:26:c1:f3:6c:43:ba:54:93:32:e3:0b:ae: 3c:02:21:00:e2:9c:dc:47:8e:88:a8:31:1c:0d:a7:64:7c:52: b7:3a:bd:7e:c6:c7:17:27:a5:4f:09:05:14:96:9a:0e:a9:96
このようにしてできた二つのファイル server.key と server.crt を適切な場 所に置いて Apache の設定ファイルを書き換えれば、 HTTPS サーバーが動く はずでござる。
Apache の設定方法は以下の通りでござる。