OpenSSLによる自己署名証明書の作成

概要

WebサーバーでHTTPS通信を実現する際にサーバーの公開鍵証明書 (証明書) を用意する必要がある。本来であれば,CA (Certificate Agent) により署名された公開鍵証明書を用意するのが望ましい。しかし,その場合手間と費用がかかる。

そのため,開発中は動作確認目的で自己署名証明書を作成することがある。この自己署名証明書はOpenSSLで作れるのだが,コマンドやオプションの組み合わせが何通りかあり,意外とややこしい。

そこで,OpenSSLでの自己署名証明書の作成方法を記す。

なお,肝心のOpenSSLのインストール方法は「インストール: OpenSSL | Webの安全性の根本を担う暗号化ライブラリー – senooken.jp」記しているので,インストールしていなければこちらを参考にインストールする。

方法

OpenSSLでの自己署名証明書の作成には以下のコマンドを実行すればよい。

openssl req -x509 -days 36500 -nodes -newkey rsa:4096 -keyout server.key >server.crt <<-EOT
JP
Tokyo-to
Nakano-ku
Example Incorporation
Example Devision
*.example.com
contact@example.com
EOT

このコマンドを実行することで,自己署名の公開鍵証明書 (server.crt) と秘密鍵 (server.key) が生成される。

ヒアドキュメント (<<-EOT) で上から順番に「国名 (C),都道府県 (ST),市区町村 (L),組織名 (O),部門・部署名 (OU),コモンネーム (ドメイン名・氏名) (CN),メールアドレス (emailAddress)」を指定している。

ヒアドキュメントを使う他に,-subjオプションで項目を自分で指定することもできる。その場合,以下のようになる。

openssl req -x509 -days 36500 -nodes -newkey rsa:4096 -keyout server.key >server.crt \
-subj "/C=JP/ST=Tokyo-to/L=Nakano-ku/O=Example Incorporation/OU=Example Devision/CN=*.example.com/emailAddress=contact@example.com"

最低限の入力内容での証明書の作成は以下のコマンドとなる。

openssl req -x509 -days 36500 -nodes -newkey rsa:4096 -keyout server.key >server.crt -subj /C=

その他,-subj ""のように引数を空にすると以下のエラーが出て失敗する。

name is expected to be in the format /type0=value0/type1=value1/type2=... where characters may be escaped by \. This name is not in that format: ''
problems making Certificate Request

ヒアドキュメントや-subjを使わない場合,以下のように対話的に入力内容が尋ねられる。

openssl req -x509 -days 36500 -nodes -newkey rsa:4096 -keyout server.key >server.crt
Generating a RSA private key
...............................................................................................................++++
........................++++
writing new private key to 'server.key'
-----
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]:JP
State or Province Name (full name) [Some-State]:Tokyo-to
Locality Name (eg, city) []:Nakano-ku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Incorporation
Organizational Unit Name (eg, section) []:Example Division
Common Name (e.g. server FQDN or YOUR name) []:*.example.com
Email Address []:contact@example.com

なお,AWSなどのクラウドサービス上で開発用に自己署名証明書を使う場合,クラウドサービスの設定でCommon Name (CN) にドメインの指定が必要な場合がある。

その場合は,*.example.comのように使用する開発環境のドメインを.*で指定して,ワイルドカード証明書を作る。.*.example.comをCommon Nameに指定すると,www.example.comの階層とexample.comを対象とした証明書となる。ただし,*.*.example.comのように複数の階層をまとめて指定することはできないので注意する。

説明

OpenSSLで証明書を作成するサブコマンドはreqとなっており,「/docs/man1.1.1/man1/req.html」の公式マニュアルで使い方が説明されている。

このサブコマンドにオプションを組み合わせることで,証明書作成に関する処理は一通りできる。

自己署名証明書作成にあたって使用した以下のコマンドのオプションの説明を表に整理した。

openssl req -x509 -days 36500 -nodes -newkey rsa:4096 -keyout server.key >server.crt
自己署名証明書作成時のオプション
オプション説明
-x509自己署名証明書を出力する。このオプションを指定しない場合,CSRを出力する。
-days n-x509オプション指定時に証明書の有効期限の日数を指定する。デフォルトは30。
-nodes秘密鍵を暗号化しない (パスフレーズなし)。No DES (共通鍵=パスフレーズ) の略。
-newkey arg新しい証明書要求 (CSR) と秘密鍵を生成する。引数にはいくつかの形式を指定できる
rsa:nbitsの形式では,鍵の形式=RSA,ビット長=nbitsの秘密鍵を意味する。rsaだけを指定した場合,サイズは設定ファイルのdefault_bitsの値 (例: 2048) が使われる。
-keyout filename秘密鍵のファイル名を指定する。指定しないと設定ファイルのdefault_keyfileの値 (例: privkey.pem) が使われる。
-subj argサブジェクト名を設定する。argは/type0=value0/type1=value1...の形式である。

簡単にオプションの補足説明などをする。

まず,-x509オプションを指定する。このオプションを指定しないと,証明書の発行要求 (CSR: Certificate Signing Request) を生成するため,出力内容がそもそも異なってくる。

-days 36500で証明書の有効期限を100年に設定している。開発環境での検証が目的のため,期限は不要なため眺めに指定した。

-nodesで秘密鍵のパスフレーズを解除している。手間を省くのが目的だ。これについては,「公開鍵暗号方式の秘密鍵のパスフレーズは不要? – senooken.jp」に考察を記している。

最後に,-newkey rsa:4096で秘密鍵のアルゴリズムと鍵の長さを指定している。デフォルトだと2048 bitである。こちらの鍵の長さについては,米国NISTのガイドで2031年から2048bitは禁止扱いとされている (参考: 暗号鍵関連の各種変数について — しっぽのさきっちょ | text.Baldanders.info)。そのため,2031年以降でも通用するように4096を指定した。

証明書の確認

作成した自己署名証明書の内容は以下のコマンドで確認できる。

openssl x509 -text -subject <server.crt
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            06:12:7d:f7:b3:fd:bc:d9:41:d1:1a:b7:96:88:38:a2:8d:09:64:f0
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = JP, ST = Tokyo-to, L = Nakano-ku, O = Example Incorporation, OU = Example Devision, CN = *.example.com, emailAddress = contact@example.com
        Validity
            Not Before: Jul 15 13:06:14 2020 GMT
            Not After : Jun 21 13:06:14 2120 GMT
        Subject: C = JP, ST = Tokyo-to, L = Nakano-ku, O = Example Incorporation, OU = Example Devision, CN = *.example.com, emailAddress = contact@example.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (4096 bit)
                Modulus:
                    00:b7:35:71:c8:fa:33:c7:99:fd:3c:58:0c:e6:05:
                    4f:14:25:f0:9d:c3:40:3f:2e:65:e9:76:a5:b2:7a:
                    99:84:fb:49:da:69:97:58:a6:cb:c8:99:39:8a:6a:
                    b2:f4:bb:e9:70:96:28:ed:e6:a5:ca:e5:7f:7f:61:
                    84:66:64:d2:c5:ce:a4:20:5d:6d:c2:72:3d:b5:7a:
                    fb:96:2a:04:29:ff:70:51:18:d8:5a:d2:27:12:41:
                    56:20:d4:95:c1:01:d1:77:9a:67:13:38:e6:2c:42:
                    78:a2:56:10:8b:29:e5:03:46:07:42:ed:e8:ad:5c:
                    3c:07:88:cf:53:70:09:0f:8f:6f:51:ea:15:3f:26:
                    47:fa:c8:52:8c:bc:8a:26:0b:d3:79:ae:c8:97:da:
                    c9:e7:da:38:39:7c:39:06:3f:3f:cb:63:af:da:ee:
                    c3:34:6f:ec:f7:90:5c:fc:89:90:6a:d1:2f:d8:0b:
                    b5:b5:ec:c8:37:4e:09:00:79:70:6d:f9:7b:d2:de:
                    7a:f8:9d:4a:ce:b6:e1:4a:eb:74:22:60:ee:b6:f9:
                    ad:5c:47:8c:e7:30:87:06:54:8b:54:e4:6e:d6:c8:
                    1f:c6:1d:27:19:c6:16:99:e1:5f:17:45:55:53:5d:
                    2c:52:c0:42:f4:3a:38:90:a5:4a:7a:ad:67:8b:03:
                    a9:88:80:33:02:c7:0c:5f:53:5c:ef:bd:3e:86:42:
                    64:d6:76:e9:a8:0a:4f:fb:f1:b6:8e:6c:64:f7:f2:
                    bc:86:a3:83:01:e9:66:7e:05:a8:9c:9f:bb:3f:24:
                    ba:77:77:a0:8c:32:ff:46:ce:e6:23:cc:05:1e:08:
                    eb:d2:48:08:6a:5e:82:dd:d0:30:b5:a0:d2:6d:bd:
                    dc:5e:a8:2f:5f:fc:71:ae:21:b2:08:bb:7f:bb:05:
                    48:44:9a:3b:71:82:46:b4:1f:93:bf:8b:e8:d0:37:
                    28:92:6a:88:57:5e:b1:ea:5f:32:81:8b:3f:05:5b:
                    ef:a7:19:ea:98:c1:d5:cf:14:ae:7a:e3:c8:f0:72:
                    23:ac:17:87:aa:2f:0b:31:ef:f8:05:62:2e:52:f6:
                    c0:ca:fa:77:22:a9:84:7c:0d:ab:b7:d2:57:8a:26:
                    a8:0e:ef:69:c6:af:df:0d:d5:95:03:f9:81:96:c5:
                    8d:bc:ba:c5:63:57:21:85:29:46:1a:a9:cf:2f:39:
                    5c:78:45:0f:9d:ad:10:86:07:1d:2e:6d:7f:db:97:
                    86:e7:a5:c7:dc:c4:9d:8c:d0:42:a2:e7:5d:12:ef:
                    63:27:dc:1b:db:79:b6:b4:9c:61:25:ce:7a:a2:c1:
                    a5:5b:b5:d0:1c:cb:9c:94:f3:f3:1a:ce:50:c7:53:
                    d8:a8:2d
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                9D:70:37:DE:95:E2:C4:7B:39:15:D3:B0:5B:BC:BB:4D:B7:CD:D9:6D
            X509v3 Authority Key Identifier: 
                keyid:9D:70:37:DE:95:E2:C4:7B:39:15:D3:B0:5B:BC:BB:4D:B7:CD:D9:6D

            X509v3 Basic Constraints: critical
                CA:TRUE
    Signature Algorithm: sha256WithRSAEncryption
         4e:a8:70:71:3d:1d:c2:e1:d2:63:21:65:41:11:f8:11:06:51:
         d7:13:a1:e5:62:cf:a0:f4:37:4c:85:7c:94:bb:06:27:56:5e:
         ed:60:eb:ed:92:bf:80:10:63:1f:dd:23:04:4b:79:8b:d4:c3:
         1c:ff:27:a1:61:85:0a:97:18:8a:b4:83:22:f2:fe:f8:d7:d1:
         d9:5a:3a:5c:06:91:59:66:6c:1a:a3:91:92:3d:a8:94:b2:e7:
         09:2e:67:2e:c4:58:ec:1e:7a:59:d6:8f:1b:2d:98:22:93:e4:
         0b:8c:97:f2:b2:23:2f:f3:26:f2:75:3f:42:70:bb:91:7b:b0:
         90:ad:47:3a:27:79:64:7c:b9:64:78:ba:e9:2e:d8:30:18:ec:
         bf:66:7a:fa:df:1f:9f:7f:e3:c1:9e:7d:ee:26:f5:9b:8d:af:
         e1:d6:96:87:94:d1:7f:3a:20:88:1a:16:dd:73:e3:80:72:98:
         15:96:c4:48:b7:f3:a4:f6:dd:7a:04:ec:ae:7b:61:0f:de:3e:
         7b:bb:e6:6b:18:3c:09:a7:a3:87:e2:0c:94:a0:b9:4e:6c:d4:
         4d:d5:af:d7:82:17:96:21:fc:17:85:b4:b2:55:0d:28:cc:62:
         27:ad:ce:9f:f2:fe:a3:78:7a:73:1d:12:a2:8b:ca:1d:06:e1:
         a0:d2:57:26:14:61:ff:00:01:b2:15:87:6a:eb:40:0d:05:48:
         6b:62:46:fe:5e:24:0f:be:97:be:35:b2:c6:7f:9c:ee:c4:e6:
         26:54:9a:e7:6f:95:1f:ea:bf:f2:fb:cd:33:db:7e:9a:be:c9:
         1d:37:2c:e5:72:90:e9:83:a2:58:c0:d3:b6:7f:c4:f9:9e:50:
         9e:c8:05:c2:aa:a2:cb:ad:bc:d5:29:38:ed:fb:33:8c:83:34:
         c4:5d:b3:d4:c6:3e:e8:9f:9f:17:44:b8:0e:f6:f3:18:ec:e5:
         bd:96:b1:4c:27:91:bd:91:8c:fd:b8:d1:ff:ae:64:57:db:28:
         0f:2c:22:1b:2f:c6:5c:ad:24:39:36:dc:9b:57:a2:0d:70:ed:
         76:e2:5a:15:d6:45:41:58:0c:57:b8:e7:21:25:0e:32:da:fd:
         95:06:3c:e3:e4:f7:72:8e:1d:3c:15:c3:9c:19:31:c8:54:d0:
         87:d5:38:05:f9:ab:ae:ff:5f:3e:9a:75:ba:ef:fc:e4:c1:f1:
         73:3d:6d:33:54:28:6a:bc:88:42:f7:c4:fb:42:33:c9:c7:a8:
         bf:78:1d:8a:01:39:ae:82:12:68:e2:fd:d3:57:a9:f2:cc:9c:
         21:1e:4b:f1:72:f0:aa:73:9c:f4:e5:96:bd:ae:34:8c:fc:7e:
         ed:62:85:e5:d7:96:31:7c
-----BEGIN CERTIFICATE-----
MIIGOzCCBCOgAwIBAgIUBhJ997P9vNlB0Rq3log4oo0JZPAwDQYJKoZIhvcNAQEL
BQAwgasxCzAJBgNVBAYTAkpQMREwDwYDVQQIDAhUb2t5by10bzESMBAGA1UEBwwJ
TmFrYW5vLWt1MR4wHAYDVQQKDBVFeGFtcGxlIEluY29ycG9yYXRpb24xGTAXBgNV
BAsMEEV4YW1wbGUgRGV2aXNpb24xFjAUBgNVBAMMDSouZXhhbXBsZS5jb20xIjAg
BgkqhkiG9w0BCQEWE2NvbnRhY3RAZXhhbXBsZS5jb20wIBcNMjAwNzE1MTMwNjE0
WhgPMjEyMDA2MjExMzA2MTRaMIGrMQswCQYDVQQGEwJKUDERMA8GA1UECAwIVG9r
eW8tdG8xEjAQBgNVBAcMCU5ha2Fuby1rdTEeMBwGA1UECgwVRXhhbXBsZSBJbmNv
cnBvcmF0aW9uMRkwFwYDVQQLDBBFeGFtcGxlIERldmlzaW9uMRYwFAYDVQQDDA0q
LmV4YW1wbGUuY29tMSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGV4YW1wbGUuY29t
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtzVxyPozx5n9PFgM5gVP
FCXwncNAPy5l6XalsnqZhPtJ2mmXWKbLyJk5imqy9LvpcJYo7ealyuV/f2GEZmTS
xc6kIF1twnI9tXr7lioEKf9wURjYWtInEkFWINSVwQHRd5pnEzjmLEJ4olYQiynl
A0YHQu3orVw8B4jPU3AJD49vUeoVPyZH+shSjLyKJgvTea7Il9rJ59o4OXw5Bj8/
y2Ov2u7DNG/s95Bc/ImQatEv2Au1tezIN04JAHlwbfl70t56+J1KzrbhSut0ImDu
tvmtXEeM5zCHBlSLVORu1sgfxh0nGcYWmeFfF0VVU10sUsBC9Do4kKVKeq1niwOp
iIAzAscMX1Nc770+hkJk1nbpqApP+/G2jmxk9/K8hqODAelmfgWonJ+7PyS6d3eg
jDL/Rs7mI8wFHgjr0kgIal6C3dAwtaDSbb3cXqgvX/xxriGyCLt/uwVIRJo7cYJG
tB+Tv4vo0DcokmqIV16x6l8ygYs/BVvvpxnqmMHVzxSueuPI8HIjrBeHqi8LMe/4
BWIuUvbAyvp3IqmEfA2rt9JXiiaoDu9pxq/fDdWVA/mBlsWNvLrFY1chhSlGGqnP
LzlceEUPna0QhgcdLm1/25eG56XH3MSdjNBCouddEu9jJ9wb23m2tJxhJc56osGl
W7XQHMuclPPzGs5Qx1PYqC0CAwEAAaNTMFEwHQYDVR0OBBYEFJ1wN96V4sR7ORXT
sFu8u023zdltMB8GA1UdIwQYMBaAFJ1wN96V4sR7ORXTsFu8u023zdltMA8GA1Ud
EwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggIBAE6ocHE9HcLh0mMhZUER+BEG
UdcToeViz6D0N0yFfJS7BidWXu1g6+2Sv4AQYx/dIwRLeYvUwxz/J6FhhQqXGIq0
gyLy/vjX0dlaOlwGkVlmbBqjkZI9qJSy5wkuZy7EWOweelnWjxstmCKT5AuMl/Ky
Iy/zJvJ1P0Jwu5F7sJCtRzoneWR8uWR4uuku2DAY7L9mevrfH59/48Gefe4m9ZuN
r+HWloeU0X86IIgaFt1z44BymBWWxEi386T23XoE7K57YQ/ePnu75msYPAmno4fi
DJSguU5s1E3Vr9eCF5Yh/BeFtLJVDSjMYietzp/y/qN4enMdEqKLyh0G4aDSVyYU
Yf8AAbIVh2rrQA0FSGtiRv5eJA++l741ssZ/nO7E5iZUmudvlR/qv/L7zTPbfpq+
yR03LOVykOmDoljA07Z/xPmeUJ7IBcKqosutvNUpOO37M4yDNMRds9TGPuifnxdE
uA728xjs5b2WsUwnkb2RjP240f+uZFfbKA8sIhsvxlytJDk23JtXog1w7XbiWhXW
RUFYDFe45yElDjLa/ZUGPOPk93KOHTwVw5wZMchU0IfVOAX5q67/Xz6adbrv/OTB
8XM9bTNUKGq8iEL3xPtCM8nHqL94HYoBOa6CEmji/dNXqfLMnCEeS/Fy8KpznPTl
lr2uNIz8fu1iheXXljF8
-----END CERTIFICATE-----

何もオプションを指定しないと,エンコードされているファイルの中身を表示するだけで意味がわからない。

そのため,-textオプションで中身をデコードしてテキストで表示する。

なお,ただ-textで表示すると不要な情報も表示されてしまう。基本的に確認したい内容は,証明書の作成時に入力した内容のことが多いので,以下のコマンドで必要部分だけ表示するとわかりやすい。

openssl x509 -text -subject -noout <server.crt | tail -n 1
subject=C = JP, ST = Tokyo-to, L = Nakano-ku, O = Example Incorporation, OU = Example Devision, CN = *.example.com, emailAddress = contact@example.com
結論

OpenSSLを用いた自己署名証明書の作成方法を記した。

WebサーバーなどでHTTPS通信をする際には証明書が必要となる。

独自ドメインで運用する場合は,Let’s Encryptを使った無料の証明書や有料の証明書で対応することになる。

テストなどでローカル環境や開発環境でHTTPS通信をしたい場合,自己署名証明書を使うのが手っ取り早い。しかし,意外と自己署名証明書の作成方法が複雑だったりするので,今回手順を整理した。

証明書は基本的にWebサーバーとセットで使うため,証明書の作り方だけあってもあまり意味がない。今後,今回記した自己署名証明書をWebサーバーに設定してHTTPS通信の実現方法も記したい。

OpenSSLによる自己署名証明書の作成” に対して2件のコメントがあります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です