自己署名証明書(オレオレ証明書)を使ってHTTPSサーバーをNode.jsで立ち上げる(windows10) その1

  • このエントリーをはてなブックマークに追加

Node.jsでHTTPSサーバーを立ち上げる(windows10)

HTTPSでクライアントとサーバー間で暗号化通信を行うために公開鍵と秘密鍵のペアと、公開鍵を元に認証局で発行されたサーバー証明書が必要である。
自分のPCにApache(HTTPサーバーソフトウェアの一つで)でHTTPサーバーを立ち上げると、http://localhost/にアクセスすることができる。
同様に、自分のPCにNode.jsで秘密鍵とサーバー証明書を読み込んでHTTPSサーバーを立ち上げると
https://localhost/にアクセスすることができる。

つまり、自分のPCにNode.jsでHTTPSサーバーを立ち上げるプログラムを組んだときに、秘密鍵とサーバー証明書を読み込む必要があるので、秘密鍵とサーバー証明書を生成する必要がある。
自分で生成するサーバー証明書(自分自身が発行するサーバー証明書)は自己署名証明書(オレオレ証明書)と言う。
自己署名証明書(オレオレ証明書)を生成するには秘密鍵とCSR(Certificate Signing Request)が必要である。CSRは証明書署名要求とも呼ばれる。CSRも自分で生成可能である。
CSRはサーバー証明書生成時だけ必要であり、Node.jsのHTTPSサーバーを立ち上げるプログラムで読み込む必要はない。

CSRとは何か
サーバー証明書発行者がサーバー証明書を発行するために必要な情報を含むファイルである。
具体的には、公開鍵とディスティングリッシュネーム(Distinguished Name:DN)が含まれる。

ディスティングリッシュネームに設定する項目は次の通り

C:Country Name国名,国を示す2文字のISO略語
ST:State or Province Name組織が置かれている都道府県
L:Locality Name組織が置かれている市区町村
O:Organization Name組織の法人名(正式英文名称)
OU:Organizational Unit Name 
(任意)
組織での部署名
※組織や証明書の発行者によっては必須とする場合がある。
CN:Common NameサーバのFQDN,あるいはIPアドレス
URLが「https://www.△△△.co.jp/」の
サーバ証明書を申請する場合、
CSRのCommon Nameは「www.△△△.co.jp.」
と指定しなければなりません。
emailAddress:Email Address
 (任意)
担当者のメールアドレス
※組織や証明書の発行者によっては必須とする場合がある。

Git Bashで秘密鍵、CSR、自己署名証明書(オレオレ証明書)を作る

Git BashはWindows上でUnix系のツールやコマンドを実行することが可能になる。
Git BashでOpenSSLパッケージのOpenSSLコマンドを実行して秘密鍵、CSR、自己署名証明書(オレオレ証明書)を生成することが可能である。
使用したGit Bashのバージョンは「git version 2.40.0.windows.1」である。


B-6@B-6-PC MINGW64 ~
$ git -v
git version 2.40.0.windows.1


秘密鍵、CSR、自己署名証明書(オレオレ証明書)の順で作っていく。

(1)Git Bashで秘密鍵を作る
次のコマンドを実行して秘密鍵「server-key.pem」を生成する。


B-6@B-6-PC MINGW64 ~/test
$ openssl genrsa -out server-key.pem 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
................................+++++
................+++++
e is 65537 (0x010001)

コマンドの解説
「openssl genrsa」コマンドは秘密鍵を生成するためのコマンドであり、乱数を利用して鍵を生成するため、実行するたびに異なる秘密鍵が生成される。
「genrsa」は「generate RSA」の略で、RSA秘密鍵を生成するために使用する。
「-out」オプションを使用して、生成された秘密鍵を「server-key.pem」という名前のファイルに保存する。
「2048」は鍵の長さを指定するパラメーターで、この場合は2048ビットの長さの鍵が生成されます。

RSA暗号では、秘密鍵と公開鍵はそれぞれ対になる値を持つ。
秘密鍵を元に生成される公開鍵は、その秘密鍵と対になる値を持つように生成されるため、「openssl genrsa」コマンドで生成された秘密鍵には、対になる公開鍵を生成するための元となる情報が含まれる。

次のコマンドで秘密鍵「server-key.pem」の中身を見ることができる。

prime(プライム)は素数
modulus(モジュラス)は法
public exponent(パブリック エクスポウネント)は公開指数
private exponent(プライベート エクスポウネント)は秘密指数
exponent(エクスポウネント)は指数
coefficient(コエフィシェント)は係数
ここはRSAのアルゴリズムだから、よく分からないな。また今度、勉強しよ。


B-6@B-6-PC MINGW64 ~/test
$ openssl pkey -in server-key.pem -text -noout
RSA Private-Key: (2048 bit, 2 primes)
modulus:
    00:c4:9d:9c:03:80:fd:6e:b8:3a:d6:73:88:f1:ce:
    53:4c:48:e9:23:99:f9:58:4b:72:b8:9a:4e:87:a7:
    f3:c5:ba:6d:7a:4b:70:88:c9:b8:63:ab:c3:9d:e6:
    45:56:d5:17:6d:5f:de:14:b8:b9:a9:f0:35:19:f1:
    ff:c0:59:de:a4:34:83:a0:7b:ce:48:28:e0:12:c1:
    b5:a3:98:dd:3c:75:79:d1:07:30:90:09:53:3a:8e:
    5d:60:74:97:02:e8:02:ae:46:69:8a:37:dc:91:5c:
    55:f9:91:52:46:04:1f:47:99:09:41:e6:ca:00:92:
    1d:a9:15:99:29:36:f5:98:a6:d5:8b:5d:5b:cc:09:
    49:6d:8f:a6:92:6d:f2:ec:93:f5:f4:b8:c6:fd:73:
    ed:6a:89:05:c8:20:86:42:e7:6e:5a:ee:dd:16:a1:
    d0:e2:ec:c5:3d:b4:e4:ce:97:a6:98:28:13:0c:90:
    a5:bd:59:32:f8:93:eb:d0:52:c5:b2:e9:ad:5c:9c:
    c2:f9:b4:45:c5:26:11:c4:e1:4a:ad:3b:ed:c2:23:
    7c:4d:f6:a7:aa:64:82:81:fd:ce:27:6e:45:aa:12:
    02:68:27:cf:6f:dd:8a:eb:85:f1:e4:19:ff:8d:ec:
    36:e6:82:37:bf:2f:67:4e:d8:06:15:ed:cf:a6:95:
    da:25
publicExponent: 65537 (0x10001)
privateExponent:
    00:a5:e2:cc:84:f0:49:e3:26:b1:0d:ca:c0:da:33:
    58:78:5e:73:c5:c3:dd:6a:af:8d:85:4f:3b:be:9c:
    e7:c2:05:fe:e4:55:ce:06:bb:1b:45:8c:e0:28:d2:
    e5:e1:d3:3c:46:dd:c1:c3:fd:ef:38:00:20:ed:59:
    0e:8d:3d:c5:e9:09:1d:9d:43:97:d1:ae:1b:0f:f8:
    3b:c6:61:ed:17:5b:8e:81:db:ed:0f:39:ae:ed:12:
    bc:99:eb:04:96:41:26:31:df:da:9f:f1:6d:b9:7f:
    0c:52:da:57:6e:17:80:44:aa:4b:f3:3c:43:66:a3:
    e1:3e:8d:a8:81:eb:8a:df:55:38:1a:4c:8e:d9:04:
    14:c1:eb:0a:e5:da:7d:53:a1:31:da:1d:a3:09:26:
    cc:87:ac:ef:43:64:9c:62:24:a4:2b:6a:65:ae:4d:
    31:db:6b:55:41:30:7a:f8:9c:5a:b1:af:1b:e7:a0:
    b4:4b:f9:16:4f:17:fa:d1:6c:7c:cc:2e:b7:96:3e:
    b6:9b:98:75:76:59:3f:ca:1c:fc:bb:27:b7:4a:1b:
    9c:6e:41:ba:75:06:3d:02:67:52:08:8e:fe:b9:23:
    f5:82:e2:98:07:e4:42:70:cd:e8:ee:18:31:05:b6:
    0d:95:05:f4:46:6f:16:48:09:84:3f:53:a4:f2:69:
    90:69
prime1:
    00:ef:fc:df:c6:97:10:83:f5:ac:56:e9:c7:1c:f9:
    1c:38:b2:a3:c9:ae:cb:08:99:bf:b4:58:85:79:06:
    a9:b1:9c:d5:50:f3:7e:7a:f3:3c:74:e9:bd:b3:67:
    4f:fd:79:f2:4c:7e:36:e3:ff:14:b8:0d:6b:73:b5:
    ae:81:3f:7b:d3:b5:f5:e7:b4:1b:69:83:b6:bf:32:
    04:59:ee:a6:d2:c4:65:e0:a6:01:a3:8a:27:8d:20:
    a1:41:da:da:b9:d1:c9:fa:03:d3:12:4c:e4:62:db:
    13:ba:e3:42:02:c8:31:ff:e2:0d:74:1a:e3:ca:c8:
    88:1e:4d:a9:3a:fa:8a:d8:df
prime2:
    00:d1:bb:ea:41:e4:1c:d9:08:a9:a1:1e:dc:cd:f0:
    e1:c3:98:4a:8a:a9:1b:b4:7a:71:73:10:b6:c4:46:
    86:19:7c:85:4e:34:b3:0d:98:f5:36:17:d8:22:b4:
    12:a7:14:aa:11:9a:06:2e:18:8a:c9:75:27:08:c9:
    b9:ac:ae:dc:03:3d:99:ad:1a:23:0b:b0:53:0f:c7:
    25:fc:45:a1:ad:8b:28:84:4d:d2:ce:d0:a1:52:b6:
    cc:5b:09:e4:ac:43:16:6f:74:e0:9e:88:0a:57:3c:
    a8:ba:31:75:ec:51:8a:d3:dc:56:20:a2:53:75:d2:
    d7:f6:ed:55:a5:19:2a:39:7b
exponent1:
    48:19:37:7d:69:1a:fc:1a:0d:a9:9a:d8:47:fb:0b:
    20:79:82:bd:6f:b6:ed:a1:8b:37:7a:34:b7:34:6a:
    3c:c2:fa:4f:34:a7:f5:f6:27:5e:94:6e:7a:7c:7a:
    4a:93:9d:58:9f:be:8b:e6:b1:69:ce:16:4f:0f:f1:
    1a:41:61:49:2c:6c:71:2c:e9:e3:5c:3f:c5:d7:17:
    f9:90:ba:2b:ad:f7:51:73:6e:20:9c:bb:df:29:43:
    69:0e:80:11:bd:56:29:b7:86:6d:04:0e:c5:28:3e:
    18:32:78:3d:6f:b9:9d:bf:62:fd:53:aa:c5:dc:53:
    10:8f:92:5c:f6:b2:4a:0f
exponent2:
    45:95:31:b8:20:a5:4d:80:29:3f:12:4d:31:6a:1c:
    8c:d7:06:cc:10:24:e7:f0:c3:98:e8:4f:aa:b8:b7:
    1e:d7:88:26:95:27:5e:78:83:ca:29:89:04:a2:77:
    99:c5:2a:53:62:a5:70:3f:a6:34:06:51:28:02:3d:
    3e:c4:58:ac:1e:90:d0:b4:5e:32:2f:92:af:26:64:
    3c:d9:21:35:c1:78:74:c4:99:0f:12:7a:a3:45:90:
    71:17:cc:2d:36:a8:c7:db:9f:f6:18:ae:4d:99:0b:
    65:92:a9:4b:f9:15:b5:0a:61:ec:bb:ce:32:c5:fb:
    ee:a9:79:03:a8:60:b0:e7
coefficient:
    11:25:57:2d:12:4c:c0:b4:27:4f:d6:98:fa:4d:47:
    20:63:a6:5c:e2:f5:54:bd:46:ee:5c:bf:cb:87:99:
    ec:65:fd:47:45:6c:8c:48:16:05:be:4e:29:88:53:
    4f:65:74:fa:45:2b:dd:ad:9d:67:92:9b:16:54:3a:
    ca:22:5c:64:aa:0b:8a:31:01:f5:8d:78:04:d4:8e:
    e7:f5:a0:13:f7:f9:fa:6b:24:21:d6:a9:ec:59:94:
    cb:d1:9c:16:eb:72:c1:12:b3:5c:f2:c3:48:1d:43:
    74:ee:04:2b:6a:0c:42:ab:d9:c6:fa:46:6d:7e:91:
    f3:c4:9b:20:f9:75:11:57

B-6@B-6-PC MINGW64 ~/test
$

コマンドの解説
「openssl pkey」コマンドは、秘密鍵の情報を表示するコマンドである。
「pkey」コマンドは、private keyの略称であり「プライベートキー」と読む。
「-in」オプションは、秘密鍵を指定する。秘密鍵はserver-key.pemである。
「-text」オプションは、テキスト形式で秘密鍵の内容を表示するためのオプションである。
「-noout」オプションは、秘密鍵自体を表示しないようにする。

(2)Git BashでCSRを作る
次のコマンドを実行してCSR「server-csr.pem」を生成する。


B-6@B-6-PC MINGW64 ~/test
$ openssl req -new -key server-key.pem -out server-csr.pem -subj "//C=JP\ST=Osaka\L=Osaka-shi\O=Sample\OU=Dev1\CN=localhost"

B-6@B-6-PC MINGW64 ~/test
$

コマンドの解説
「//」と2つ「/」を重ねているのはエスケープ処理のためである。
「openssl req -new」コマンドは新しい CSRを作成するためのコマンドである。「req」コマンドは、X.509証明書(デジタル証明書)リクエストを処理する。CSRを生成するために使用される。
「req」は、requestの略称であり「リクエストコマンド」と読む。
「-new」オプションは新しいCSRを生成するためのオプションである。
「-key」オプションは、CSRの生成に使用する秘密鍵のファイルを指定するために使用されます。この場合、server-key.pemという名前の秘密鍵ファイルが指定されています。
「-subj」オプションは、生成されたCSRに埋め込むサブジェクト(subject)情報を指定する。
「-subj」オプションは、「subject」の略称であり「サブジェクトオプション」と読む。
「サブジェクト(subject)情報」は「ディスティングリッシュネーム(Distinguished Name:DN)」と同じ意味である。

サブジェクト情報に次の値を設定する。
C(Country):国名,国を示す2文字のISO略語 C=JP
ST(State):組織が置かれている都道府県 ST=Osaka
L(City or Locality):組織が置かれている市区町村 L=Osaka-shi
O(Organization):組織の法人名(正式英文名称) O=Sample
OU(Organization Unit):組織での部署名 OU=Dev1
CN(Common Name):サーバのFQDN,あるいはIPアドレス CN=localhost

「-out」オプションを使用して、生成されたCSRを「server-csr.pem」という名前のファイルに保存する。

次のコマンドでCSRの中身を見ることができる。
「Subject」は「主体者」である。
「Subject Public Key Info」は「主体者の公開鍵情報」である。


B-6@B-6-PC MINGW64 ~/test
$ openssl req -in server-csr.pem -text -noout
Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: C = JP, ST = Osaka, L = Osaka-shi, O = Sample, OU = Dev1, CN = localhost
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:c4:9d:9c:03:80:fd:6e:b8:3a:d6:73:88:f1:ce:
                    53:4c:48:e9:23:99:f9:58:4b:72:b8:9a:4e:87:a7:
                    f3:c5:ba:6d:7a:4b:70:88:c9:b8:63:ab:c3:9d:e6:
                    45:56:d5:17:6d:5f:de:14:b8:b9:a9:f0:35:19:f1:
                    ff:c0:59:de:a4:34:83:a0:7b:ce:48:28:e0:12:c1:
                    b5:a3:98:dd:3c:75:79:d1:07:30:90:09:53:3a:8e:
                    5d:60:74:97:02:e8:02:ae:46:69:8a:37:dc:91:5c:
                    55:f9:91:52:46:04:1f:47:99:09:41:e6:ca:00:92:
                    1d:a9:15:99:29:36:f5:98:a6:d5:8b:5d:5b:cc:09:
                    49:6d:8f:a6:92:6d:f2:ec:93:f5:f4:b8:c6:fd:73:
                    ed:6a:89:05:c8:20:86:42:e7:6e:5a:ee:dd:16:a1:
                    d0:e2:ec:c5:3d:b4:e4:ce:97:a6:98:28:13:0c:90:
                    a5:bd:59:32:f8:93:eb:d0:52:c5:b2:e9:ad:5c:9c:
                    c2:f9:b4:45:c5:26:11:c4:e1:4a:ad:3b:ed:c2:23:
                    7c:4d:f6:a7:aa:64:82:81:fd:ce:27:6e:45:aa:12:
                    02:68:27:cf:6f:dd:8a:eb:85:f1:e4:19:ff:8d:ec:
                    36:e6:82:37:bf:2f:67:4e:d8:06:15:ed:cf:a6:95:
                    da:25
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
        Requested Extensions:
    Signature Algorithm: sha256WithRSAEncryption
         73:b2:a6:5d:d7:0e:28:29:2e:b4:51:70:41:16:b6:35:5f:f6:
         7a:f6:ca:74:af:8c:85:cf:7d:32:f1:40:b1:62:70:ed:2b:9a:
         cd:c5:13:44:f8:33:ed:fb:5e:5d:9b:8e:d9:52:66:fc:1f:1f:
         11:27:93:31:7b:d8:00:7a:03:60:78:88:04:40:52:b9:78:5f:
         59:b0:df:3f:a1:97:d0:3d:b9:b8:c2:40:97:ab:fa:d4:20:46:
         e6:df:22:31:a1:7e:07:56:bb:83:ab:05:0c:59:99:a9:64:94:
         de:b7:c3:61:e9:af:e3:5f:28:89:29:5c:ab:00:91:e4:bc:eb:
         60:e6:81:69:70:6f:5d:91:46:c0:fe:b5:88:e9:f9:a3:d3:2a:
         ab:46:2b:17:54:68:98:97:f8:4a:4f:7d:de:d1:18:27:72:0f:
         87:b8:da:3f:a3:86:38:98:9d:b2:7d:91:f7:f8:32:e5:9d:19:
         30:02:16:e4:73:05:2e:fa:0e:bb:1b:fd:d7:52:a9:cd:03:28:
         19:ee:1d:0a:74:58:78:10:bf:4c:bc:75:22:db:e3:ae:3c:ee:
         8a:58:c0:a3:46:ee:28:a9:30:08:60:cc:d0:01:c4:8f:4f:22:
         00:c5:38:39:32:00:72:aa:3d:92:13:2c:d3:5b:23:60:69:8b:
         2a:38:9c:d4

B-6@B-6-PC MINGW64 ~/test
$

コマンドの解説
「req」コマンドは、X.509証明書(デジタル証明書)リクエストを処理する。CSRを表示するために使用される。「req」は、requestであり「リクエストコマンド」と読む。
「-in」オプションは、CSRのファイル名を指定する。CSRはserver-csr.pemである。
「-text」オプションは、テキスト形式でCSRの内容を表示するためのオプションである。
「-noout」オプションは、CSR自体を表示しないようにする。

次のコマンドでCSRから公開鍵だけを表示する。


B-6@B-6-PC MINGW64 ~/test
$ openssl req -in server-csr.pem -noout -pubkey
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxJ2cA4D9brg61nOI8c5T
TEjpI5n5WEtyuJpOh6fzxbptektwiMm4Y6vDneZFVtUXbV/eFLi5qfA1GfH/wFne
pDSDoHvOSCjgEsG1o5jdPHV50QcwkAlTOo5dYHSXAugCrkZpijfckVxV+ZFSRgQf
R5kJQebKAJIdqRWZKTb1mKbVi11bzAlJbY+mkm3y7JP19LjG/XPtaokFyCCGQudu
Wu7dFqHQ4uzFPbTkzpemmCgTDJClvVky+JPr0FLFsumtXJzC+bRFxSYRxOFKrTvt
wiN8TfanqmSCgf3OJ25FqhICaCfPb92K64Xx5Bn/jew25oI3vy9nTtgGFe3PppXa
JQIDAQAB
-----END PUBLIC KEY-----

B-6@B-6-PC MINGW64 ~/test
$

コマンドの解説
「req」コマンドは、X.509証明書(デジタル証明書)リクエストを処理する。
「req」は、requestであり「リクエストコマンド」と読む。
「-in」オプションは、CSRのファイル名を指定する。CSRはserver-csr.pemである。
「-noout」オプションは、CSR自体を表示しないようにする。
「-pubkey」オプションは、CSRから公開鍵を抽出して表示する。
「-pubkey」オプションは、public keyの略称である。

次のコマンドでCSRから公開鍵だけをテキスト形式で表示する。


B-6@B-6-PC MINGW64 ~/test
$ openssl req -in server-csr.pem -noout -pubkey | openssl rsa -pubin -text -noout
RSA Public-Key: (2048 bit)
Modulus:
    00:c4:9d:9c:03:80:fd:6e:b8:3a:d6:73:88:f1:ce:
    53:4c:48:e9:23:99:f9:58:4b:72:b8:9a:4e:87:a7:
    f3:c5:ba:6d:7a:4b:70:88:c9:b8:63:ab:c3:9d:e6:
    45:56:d5:17:6d:5f:de:14:b8:b9:a9:f0:35:19:f1:
    ff:c0:59:de:a4:34:83:a0:7b:ce:48:28:e0:12:c1:
    b5:a3:98:dd:3c:75:79:d1:07:30:90:09:53:3a:8e:
    5d:60:74:97:02:e8:02:ae:46:69:8a:37:dc:91:5c:
    55:f9:91:52:46:04:1f:47:99:09:41:e6:ca:00:92:
    1d:a9:15:99:29:36:f5:98:a6:d5:8b:5d:5b:cc:09:
    49:6d:8f:a6:92:6d:f2:ec:93:f5:f4:b8:c6:fd:73:
    ed:6a:89:05:c8:20:86:42:e7:6e:5a:ee:dd:16:a1:
    d0:e2:ec:c5:3d:b4:e4:ce:97:a6:98:28:13:0c:90:
    a5:bd:59:32:f8:93:eb:d0:52:c5:b2:e9:ad:5c:9c:
    c2:f9:b4:45:c5:26:11:c4:e1:4a:ad:3b:ed:c2:23:
    7c:4d:f6:a7:aa:64:82:81:fd:ce:27:6e:45:aa:12:
    02:68:27:cf:6f:dd:8a:eb:85:f1:e4:19:ff:8d:ec:
    36:e6:82:37:bf:2f:67:4e:d8:06:15:ed:cf:a6:95:
    da:25
Exponent: 65537 (0x10001)

B-6@B-6-PC MINGW64 ~/test
$

コマンドの解説
「openssl req -in server-csr.pem -noout -pubkey」コマンドで公開鍵を標準出力して、
「openssl rsa -pubin -text -noout」コマンドで標準入力から公開鍵を読み込みテキスト形式で表示する。
「openssl rsa」は、標準入力から公開鍵を読み込む。「rsa」はRSA鍵を処理するためのコマンドである。
「-pubin」オプションは、「openssl rsa」に入力として公開鍵を提供することを意味する。
「-pubin」オプションは、「public key input」の略称である。パブリックキーインプットオプションと読む。
「-text」オプションは、公開鍵の情報をテキスト形式で表示する
「-noout」オプションは、公開鍵自体を表示しないようにする。



(3)Git Bashで自己署名証明書(オレオレ証明書)を作る
次のコマンドを実行して自己署名証明書(オレオレ証明書)「server-crt.pem」を生成する。


B-6@B-6-PC MINGW64 ~/test
$ openssl x509 -req -in server-csr.pem -out server-crt.pem -signkey server-key.pem -days 3650 -sha256

Signature ok
subject=C = JP, ST = Osaka, L = Osaka-shi, O = Sample, OU = Dev1, CN = localhost
Getting Private key

B-6@B-6-PC MINGW64 ~/test
$

コマンドの解説
「x509」コマンドはX.509証明書(デジタル証明書)を生成するためのコマンドである。自己署名証明書(オレオレ証明書)はデジタル証明書の一種である。
「-req」オプションは、「x509」コマンドがCSRを処理することを指定するオプションである。
「-req」オプションは、リクエストオプションと読む。
「-in」オプションは、CSRのファイル名を指定するオプションである。CSRはserver-csr.pemである。
「-out」オプションは、生成された自己署名証明書(オレオレ証明書)を保存するためのファイル名を指定する。自己署名証明書(オレオレ証明書)はserver-crt.pemである。
「-signkey」オプションは、CSRに署名するために使用される秘密鍵を指定するためのオプションである。指定された秘密鍵でCSRに署名された証明書を作成する。秘密鍵はserver-key.pemである。
「-sha256」オプションは、自己署名証明書(オレオレ証明書)に使用するハッシュアルゴリズムを指定するオプションである。「-sha256」オプションは「SHA-256アルゴリズム」である。
「-days」オプションは、作成される証明書の有効期間を指定するためのオプションである。この場合、3650日、つまり約10年の有効期間を指定している。

次のコマンドで自己署名証明書(オレオレ証明書)をテキスト形式で表示する。

作成した自己署名証明書(オレオレ証明書)において、
自己署名証明書(オレオレ証明書)ではIssuer(発行者)とSubject(主体者)が同じ値になる。
「Issuer: C = JP, ST = Osaka, L = Osaka-shi, O = Sample, OU = Dev1, CN = localhost
「Subject: C = JP, ST = Osaka, L = Osaka-shi, O = Sample, OU = Dev1, CN = localhost
「Subject Public Key Info」は「主体者の公開鍵情報」である。
Validityは有効期限を意味する。
自己署名証明書(オレオレ証明書)の期限は、Not Before(開始日)とNot After(終了日)の2つのタイムスタンプで定義される。Not Before(開始日)は、証明書が有効になる日付を示し、Not After(終了日)は、証明書が期限切れになる日付を示します。自己署名証明書(オレオレ証明書)は2023年5月1日9時1分45秒(GMT)に有効になり、2033年4月28日9時1分45秒(GMT)に期限切れになる。有効期限10年で設定したとおりである。
RFC3280では、電子証明書はX.509ver3の形式が用いられると書いてある。
しかし、自己署名証明書では「Version: 1 (0x0)」となっているな。
うーん。自己署名証明書はX.509ver3で生成されないのか?ここは不明。


B-6@B-6-PC MINGW64 ~/test
$ openssl x509 -in server-crt.pem -text -noout
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            31:41:97:5a:a4:96:d9:04:ba:ca:8c:6c:9a:d6:85:14:37:34:cd:b7
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = JP, ST = Osaka, L = Osaka-shi, O = Sample, OU = Dev1, CN = localhost
        Validity
            Not Before: May  1 09:01:45 2023 GMT
            Not After : Apr 28 09:01:45 2033 GMT
        Subject: C = JP, ST = Osaka, L = Osaka-shi, O = Sample, OU = Dev1, CN = localhost
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:c4:9d:9c:03:80:fd:6e:b8:3a:d6:73:88:f1:ce:
                    53:4c:48:e9:23:99:f9:58:4b:72:b8:9a:4e:87:a7:
                    f3:c5:ba:6d:7a:4b:70:88:c9:b8:63:ab:c3:9d:e6:
                    45:56:d5:17:6d:5f:de:14:b8:b9:a9:f0:35:19:f1:
                    ff:c0:59:de:a4:34:83:a0:7b:ce:48:28:e0:12:c1:
                    b5:a3:98:dd:3c:75:79:d1:07:30:90:09:53:3a:8e:
                    5d:60:74:97:02:e8:02:ae:46:69:8a:37:dc:91:5c:
                    55:f9:91:52:46:04:1f:47:99:09:41:e6:ca:00:92:
                    1d:a9:15:99:29:36:f5:98:a6:d5:8b:5d:5b:cc:09:
                    49:6d:8f:a6:92:6d:f2:ec:93:f5:f4:b8:c6:fd:73:
                    ed:6a:89:05:c8:20:86:42:e7:6e:5a:ee:dd:16:a1:
                    d0:e2:ec:c5:3d:b4:e4:ce:97:a6:98:28:13:0c:90:
                    a5:bd:59:32:f8:93:eb:d0:52:c5:b2:e9:ad:5c:9c:
                    c2:f9:b4:45:c5:26:11:c4:e1:4a:ad:3b:ed:c2:23:
                    7c:4d:f6:a7:aa:64:82:81:fd:ce:27:6e:45:aa:12:
                    02:68:27:cf:6f:dd:8a:eb:85:f1:e4:19:ff:8d:ec:
                    36:e6:82:37:bf:2f:67:4e:d8:06:15:ed:cf:a6:95:
                    da:25
                Exponent: 65537 (0x10001)
    Signature Algorithm: sha256WithRSAEncryption
         95:bd:df:11:02:a2:2e:cf:09:95:98:e0:38:74:c8:16:99:3e:
         6f:f8:62:2e:67:df:b4:29:99:19:0a:81:19:64:bb:d5:27:07:
         af:88:a0:93:6f:d0:16:10:0e:1a:67:51:93:f4:4f:bb:77:05:
         a8:f3:57:0c:79:a3:a7:cc:a5:27:c2:7a:29:ba:91:f6:80:4b:
         99:39:a1:e5:21:57:8e:c8:b8:bd:4c:c4:a6:91:78:71:22:03:
         53:e2:72:43:d2:a1:46:48:95:97:6d:26:ef:64:b2:f7:a3:b8:
         1d:0f:42:76:5b:2f:68:5e:e6:52:1c:88:9d:f9:ae:26:6f:6e:
         32:0e:36:57:12:cd:28:64:a2:d5:28:7a:31:d8:74:a3:57:14:
         a5:4a:6e:a9:05:ca:25:1e:d2:c9:9a:e6:61:ba:31:36:2d:54:
         22:17:40:8f:ad:07:7e:84:55:8a:4b:8d:4d:f0:ac:28:7c:5e:
         bf:2e:a1:2a:f3:f1:25:4d:3d:98:e1:8c:a4:59:35:01:83:39:
         c9:8f:10:fb:9d:56:00:32:ac:d3:0f:ff:34:4b:72:0d:f3:cd:
         87:c6:75:09:e2:11:eb:94:3a:05:20:80:7a:1e:0a:85:e4:ed:
         f8:d4:47:43:ff:b7:1b:63:55:c3:c3:e9:79:dc:b3:e5:52:c1:
         ad:e8:17:29

B-6@B-6-PC MINGW64 ~/test
$

コマンドの解説
「openssl x509」コマンドはX.509証明書(デジタル証明書)の操作を行うためのコマンドです。
自己署名証明書(オレオレ証明書)はデジタル証明書の一種である。
「-in」オプションを使用して自己署名証明書(オレオレ証明書)のファイル名を指定する。
「-text」オプションは、自己署名証明書(オレオレ証明書)の情報をテキスト形式で表示する。
「-noout」オプションは、自己署名証明書(オレオレ証明書)自体を表示しないようする。

次のコマンドで自己署名証明書(オレオレ証明書)から公開鍵だけを表示する。


B-6@B-6-PC MINGW64 ~/test
$ openssl x509 -in server-crt.pem -noout -pubkey
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxJ2cA4D9brg61nOI8c5T
TEjpI5n5WEtyuJpOh6fzxbptektwiMm4Y6vDneZFVtUXbV/eFLi5qfA1GfH/wFne
pDSDoHvOSCjgEsG1o5jdPHV50QcwkAlTOo5dYHSXAugCrkZpijfckVxV+ZFSRgQf
R5kJQebKAJIdqRWZKTb1mKbVi11bzAlJbY+mkm3y7JP19LjG/XPtaokFyCCGQudu
Wu7dFqHQ4uzFPbTkzpemmCgTDJClvVky+JPr0FLFsumtXJzC+bRFxSYRxOFKrTvt
wiN8TfanqmSCgf3OJ25FqhICaCfPb92K64Xx5Bn/jew25oI3vy9nTtgGFe3PppXa
JQIDAQAB
-----END PUBLIC KEY-----

B-6@B-6-PC MINGW64 ~/test
$

コマンドの解説
「openssl x509」コマンドはX.509証明書(デジタル証明書)の操作を行うためのコマンドです。
自己署名証明書(オレオレ証明書)はデジタル証明書の一種である。
「-in」オプションを使用して自己署名証明書(オレオレ証明書)のファイル名を指定する。
「-text」オプションは、自己署名証明書(オレオレ証明書)の情報をテキスト形式で表示する。
「-noout」オプションは、自己署名証明書(オレオレ証明書)自体を表示しないようする。
「-pubkey」オプションは、自己署名証明書(オレオレ証明書)から公開鍵を抽出して表示する。
「-pubkey」オプションは、public keyの略称である。

次のコマンドで自己署名証明書(オレオレ証明書)から公開鍵だけをテキスト形式で表示する。


B-6@B-6-PC MINGW64 ~/test
$ openssl x509 -in server-crt.pem -noout -pubkey | openssl rsa -pubin -text -noout
RSA Public-Key: (2048 bit)
Modulus:
    00:c4:9d:9c:03:80:fd:6e:b8:3a:d6:73:88:f1:ce:
    53:4c:48:e9:23:99:f9:58:4b:72:b8:9a:4e:87:a7:
    f3:c5:ba:6d:7a:4b:70:88:c9:b8:63:ab:c3:9d:e6:
    45:56:d5:17:6d:5f:de:14:b8:b9:a9:f0:35:19:f1:
    ff:c0:59:de:a4:34:83:a0:7b:ce:48:28:e0:12:c1:
    b5:a3:98:dd:3c:75:79:d1:07:30:90:09:53:3a:8e:
    5d:60:74:97:02:e8:02:ae:46:69:8a:37:dc:91:5c:
    55:f9:91:52:46:04:1f:47:99:09:41:e6:ca:00:92:
    1d:a9:15:99:29:36:f5:98:a6:d5:8b:5d:5b:cc:09:
    49:6d:8f:a6:92:6d:f2:ec:93:f5:f4:b8:c6:fd:73:
    ed:6a:89:05:c8:20:86:42:e7:6e:5a:ee:dd:16:a1:
    d0:e2:ec:c5:3d:b4:e4:ce:97:a6:98:28:13:0c:90:
    a5:bd:59:32:f8:93:eb:d0:52:c5:b2:e9:ad:5c:9c:
    c2:f9:b4:45:c5:26:11:c4:e1:4a:ad:3b:ed:c2:23:
    7c:4d:f6:a7:aa:64:82:81:fd:ce:27:6e:45:aa:12:
    02:68:27:cf:6f:dd:8a:eb:85:f1:e4:19:ff:8d:ec:
    36:e6:82:37:bf:2f:67:4e:d8:06:15:ed:cf:a6:95:
    da:25
Exponent: 65537 (0x10001)

B-6@B-6-PC MINGW64 ~/test
$

コマンドの解説
「openssl x509 -in server-crt.pem -noout -pubkey」コマンドで公開鍵を標準出力して、
「openssl rsa -pubin -text -noout」コマンドで標準入力から公開鍵を読み込みテキスト形式で表示する。
「openssl rsa」は、標準入力から公開鍵を読み込む。「rsa」はRSA鍵を処理するためのコマンドである。
「-pubin」は、「openssl rsa」に入力として公開鍵を提供することを意味する。
「-pubin」オプションは、「public key input」の略称であり「パブリックキーインプットオプション」と読む。
「-text」オプションは、公開鍵の情報をテキスト形式で表示する
「-noout」オプションは、公開鍵自体を表示しないようにする。

次のコマンドで証明書が認証局(CA)で署名された証明書であることを確認する。「openssl verify -CAfile」の使い方は次の通りである。
このコマンドは、サーバー証明書が認証局(CA)によって署名されているかどうかを確認する。
「CA bundle file」には、ルート証明書or証明書チェーン(ルート証明書+中間証明書+サーバー証明書)を指定する。「CA bundle file」には必ずルート証明書あるいはオレオレ証明書が含まれる必要がある。
「bundle file」という用語自体は、単に複数のファイルを1つにまとめたファイルのことを意味する。証明書の場合は証明書チェーンを意味する。
「server certificate file」には、サーバー証明書or中間証明書orルート証明書を指定する。


openssl verify -CAfile <CA bundle file> <server certificate file>

自己署名証明書の場合は認証局(CA)にも自己署名証明書を指定する。


openssl verify -CAfile 自己署名証明書 自己署名証明書

「server-crt.pem:ok」と表示されたら、server-crt.pemは自分で自分のサーバー証明書に署名した自己署名証明書であると言える。


B-6@B-6-PC MINGW64 ~/test
$ openssl verify -CAfile server-crt.pem server-crt.pem
server-crt.pem: OK

B-6@B-6-PC MINGW64 ~/test
$

HTTPSサーバーを立ち上げるNode.jsのコード

環境
Windows10(64bit)
nvm(Node Version Manager)を使用する。
nvmはnodeとnpmのバージョンの切り替えができる。
node.jsはアップデートが頻繁に行われるため、バージョン管理ツールを使うと都合が良いことが多い。
「特定のプロジェクトに必要なNode.jsのバージョンを簡単にインストールして使用することができる。」や「プロジェクト毎にNode.jsのバージョンの切り替えが簡単になる。」等のメリットがある。
nvm 1.1.10
node v18.15.0
npm 9.5.0

HTTPSサーバーを立ち上げるコード「index.js」を次に示す。
https://localhost/にアクセスすると「Hello World!」とブラウザに表示され、コンソールにはアクセスした現在時刻がISO 8601形式のUTC表現で表示される。


const https = require('https');
const fs = require('fs');
const port = 443;

const options = {
  key: fs.readFileSync('server-key.pem'),
  cert: fs.readFileSync('server-crt.pem')
};

https.createServer(options, (req, res) => {
  res.writeHead(200);
  res.end('Hello World!');

  //変数dateに、Dateオブジェクトのインスタンスを格納する。
  let date = new Date();
  //現在時刻をISO 8601形式のUTC表現で表示する
  let today = date.toISOString();
  console.log(today);
  
}).listen(port);

作ったプログラムを実行する。


C:\node\https>node -v
v18.15.0

C:\node\https>nvm -v
1.1.10

C:\node\https>npm -v
9.5.0

C:\node\https>nvm list

  * 18.15.0 (Currently using 64-bit executable)
    16.14.0

C:\node\https>node index.js
2023-05-02T08:42:05.944Z
2023-05-02T08:42:06.004Z

https://localhost/にアクセスすると「Hello World!」とブラウザに表示される。


自己署名証明書(オレオレ証明書)をfirefoxで見ると次のようになる。主体者名と発行者名が一致している。
有効期間は10年になっている。
firefoxでは単に「証明書」と書いてあるな。


関連する記事
Git Bash[バージョン:2.40.0.windows.1]をWindows10(64bit)にインストールをする (attacktube.com)
X.509証明書(デジタル証明書) (attacktube.com)
自己署名証明書(オレオレ証明書) (attacktube.com)

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*