Notebook

これは日々の作業を通して学んだことや毎日の生活で気づいたことをを記録しておく備忘録である。

HTML ファイル生成日時: 2024/11/21 17:40:55.112 (台灣標準時)

HTTPS サーバーのために秘密鍵と証明書を作成する方法

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 の設定方法は以下の通りでござる。



Frequently accessed files

  1. Computer___Python/20220518_0.html
  2. Computer___Network/20230726_00.html
  3. Misc___Taiwan/20240207_00.html
  4. Computer___Network/20230516_00.html
  5. Computer___FreeBSD/20220621_0.html
  6. Computer___Python/20220715_0.html
  7. Computer___Network/20230508_00.html
  8. Food___Taiwan/20220429_0.html
  9. Computer___NetBSD/20220817_3.html
  10. Computer___Python/20220410_0.html
  11. Computer___Network/20240416_00.html
  12. Computer___Network/20240130_00.html
  13. Computer___Debian/20210223_1.html
  14. Computer___NetBSD/20230119_00.html
  15. Computer___Python/20210124_0.html
  16. Computer___Python/20221013_0.html
  17. Computer___NetBSD/20220818_1.html
  18. Computer___NetBSD/20220428_0.html
  19. Science___Math/20220420_0.html
  20. Computer___NetBSD/20240101_02.html
  21. Computer___NetBSD/20220808_0.html
  22. Computer___TeX/20230503_00.html
  23. Computer___NetBSD/20230515_00.html
  24. Science___Astronomy/20220503_0.html
  25. Computer___NetBSD/20210127_0.html
  26. Computer___Python/20240101_00.html
  27. Computer___Network/20220413_1.html
  28. Computer___Python/20220816_1.html
  29. Computer___NetBSD/20210204_0.html
  30. Travel___Taiwan/20220809_2.html


HTML file generated by Kinoshita Daisuke.