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件のコメントがあります。