サーバー証明書の作り方
- ここでは一般的なCSRの作成方法について解説する。
Let's Encryptの場合はまた別手順となるのでそちらで解説する。
自己署名証明書、いわゆる俺々証明書はまた別の情報が必要となるため、こちらも別途解説する。
- 認証局として Let's Encrypt を採用する場合、トレードオフが発生する。よく考えて選択すること。
- ターゲット(サイト閲覧者)とするクライアントが対応しているかどうか。
PC向けとしてはXP対応も考慮されているので大丈夫と思われる(ルート認証局は IdenTrust DST Root CA X3)。
- フューチャーフォン(au端末については全滅なのを確認)や一部Android端末については未対応である。
- 古いiPhone端末では未対応であるが、事実上存在しないので問題無いと思われる。
- DV(Domain Validation)ではなく、OV(Organization Validation)ないしEV(Extended Validation)証明書を必要とするケース(ポリシー)なら選択の余地無し。
- SSLアクセラレータなどで、機器の中の秘密鍵が取り出せないケース(HSM - Hardware Security Module)。
- このケースは、当然のことながら本手順も適用できない。
- 公開鍵(CSR)を取り出せる場合は別の話となるが、ここでの話では無い。
- SSL証明書の統合管理・分散管理。どちらが良いという話でもないが、サーバーやネットワーク機器の管理上の都合で選択。
- ターゲット(サイト閲覧者)とするクライアントが対応しているかどうか。
準備
ディレクトリ・ファイル構成
ここでは以下の通りの構成で証明書を管理するモノとする。 環境によってはここまで頑張らなくてもよい。 が、せめてオーナー・パーミッションには気を遣おう。
用途 |
パス名 |
オーナー |
パーミッション |
備考 |
証明書管理ディレクトリトップ |
/ssl |
root:wheel |
0755 |
|
個別証明書管理ディレクトリ |
/ssl/コモンネーム |
root:wheel |
0755 |
|
SSL証明書公開鍵ファイル |
/ssl/コモンネーム/コモンネーム,鍵種別,有効期限開始年月-有効期限終了年月,番号.crt |
root:wheel |
0444 |
|
SSL証明書CSRファイル |
/ssl/コモンネーム/コモンネーム,鍵種別,有効期限開始年月-有効期限終了年月,番号.csr |
root:wheel |
0444 |
|
SSL証明書秘密鍵ファイル |
/ssl/コモンネーム/コモンネーム,鍵種別,有効期限開始年月-有効期限終了年月,番号.key |
root:wheel |
0400 |
平文で保存するものとする |
鍵種別
鍵種別 |
公開鍵暗号アルゴリズム |
署名アルゴリズム |
備考 |
rsa1024-sha1 |
RSA 1024bit |
SHA1 160bit |
2013年中に退役 |
rsa2048-sha1 |
RSA 2048bit |
SHA1 160bit |
2016年中に退役 |
rsa2048-sha256 |
RSA 2048bit |
SHA-2 256bit |
今のスタンダード |
rsa3072-sha384 |
RSA 3072bit |
SHA-2 384bit |
|
rsa4096-sha384 |
RSA 4096bit |
SHA-2 384bit |
|
prime256v1-sha256 |
ECDSA(prime256v1) 256bit |
SHA-2 256bit |
今後の次世代 |
secp384r1-sha256 |
ECDSA(secp384r1) 384bit |
SHA-2 256bit |
|
secp521r1-sha256 |
ECDSA(secp521r1) 521bit |
SHA-2 256bit |
|
鍵種別 |
公開鍵暗号アルゴリズム |
署名アルゴリズム |
備考 |
ed25519-sha256 |
EdDSA(Ed25519) 253bit |
SHA-2 256bit |
ECDSAの次世代だけどどうなるかわからないので参考までに |
ed448-sha256 |
EdDSA(Ed448) 446bit |
SHA-2 256bit |
ECDSAの次世代だけどどうなるかわからないので参考までに |
RSAの3072bit, 4096bitの時の署名アルゴリズムがSHA-2 384bitが妥当(トレンド的に)かはわからなかった。
というのも4096bitが当然の時代には、おそらくSHA-3(224/256/384/512bit)が登場していると思われる(2016年現在検証フェーズ)。
とは言え、今時点で既にRSA4096bit/SHA384なルート証明書が存在するので、一概に否定するモノでは無いと考えている(眉唾とは見てるけど)。
ECDSAは同じ鍵長(例えば 256bit だとしても)でも選ぶ楕円曲線系によって振る舞いが違うという話なので「パラメータ」というものを指定してやる必要がある。
これは例えば、ECDSA 256bitという情報だけでは証明書を作れないことを意味する。 鍵長自体は 256bit, 384bit, 521bit(512 ではなく 521)が一般的だが、どの「パラメータ」を採用するのが一般的なのかはよくわからなかった。 もちろんOpenSSLなら何を選んでも大抵は大丈夫だが、相互運用を考えると、とてもとても信用できる話ではなく…。
若干古いので今の事情に合ってるか不明だが、情報セキュリティ技術動向調査(2010年上期)楕円曲線暗号の整備動向より、それぞれ prime256v1(=secp256r1)/secp384r1/secp521r1 を選んでみた。
有効期限
有効期限は「YYYYMM」で表現するモノとする。CSR作成時に有効期限を決定することができないため、月に丸めるものとする。
番号
シマンテック(旧ベリサイン)の場合、同じコモンネームの証明書でも複数枚、必要な都度、証明書を作成/署名する必要があるということで、 ゼロオリジンでカウントアップしていくものとする。 ほとんどのケースで、これは0のみとなる。
なおデジサート移行後の運用形態がどうなったか不明なので特に更新は無しで。
拡張子
拡張子については諸説流派(.pem 派 V.S. .crt 派)があるので、以下にルール化する。
拡張子 |
意味 |
備考 |
.crt |
署名済みSSL公開鍵証明書 |
|
.csr |
SSL公開鍵証明書(署名リクエスト) |
|
.key |
SSL秘密鍵 |
|
.p12 |
PKCS#12形式 |
コンテナとして使用(本ページでは具体的には取り上げない) |
確認項目
証明書のディスティングイッシュ名(DN/Distinguish Name)を決定する必要がある。ディスティングイッシュ名は以下の項目により構成される。
項目名 |
属性 |
設定例 |
備考 |
国名(Country name) |
C |
JP |
|
都道府県名(STate or province name) |
ST |
Tokyo |
|
市区町村(Locality name) |
L |
Suginami-ku |
|
組織名(Organization name) |
O |
Ninth Nine |
|
部門名(Organization Unit name) |
OU |
System Division |
|
コモンネーム(Common Name) |
CN |
wiki.ninth-nine.com |
|
メールアドレス(emailAddress) |
emailAddress |
|
|
上記をまとめたのが下記の通りとなる。
/C=JP/ST=Tokyo/L=Suginami-ku/O=Ninth Nine/OU=System Division/CN=wiki.ninth-nine.com
省略した項目はたいてい、項目名から省略する(下記例では OU を省略してみた)。
/C=JP/ST=Tokyo/L=Suginami-ku/O=Ninth Nine/CN=wiki.ninth-nine.com
また、必要な項目は認証局毎に違うので事前に確認すること。 一般にDV(Domain Validation)で都道府県以下が必要になることは無いが、営業的付加情報として必須としてる場合もある。 Let's Encrypt に至っては「CN」のみとなる。
/CN=wiki.ninth-nine.com
CSRの作成(RSA)
※opensslコマンドのオプションは長いので複数行に分割している。実際の実行は、1行(改行無し)で記述すること。
# openssl req -new -newkey rsa:2048 -nodes -sha256 -subj "/C=JP/ST=Tokyo/L=Suginami-ku/O=Ninth Nine/OU=System Division/CN=wiki.ninth-nine.com" -out /ssl/wiki.ninth-nine.com/wiki.ninth-nine.com,rsa2048-sha256,201605-201705,0.csr -keyout /ssl/wiki.ninth-nine.com/wiki.ninth-nine.com,rsa2048-sha256,201605-201705,0.key # chmod 444 /ssl/wiki.ninth-nine.com/wiki.ninth-nine.com,rsa2048-sha256,201605-201705,0.csr # chmod 400 /ssl/wiki.ninth-nine.com/wiki.ninth-nine.com,rsa2048-sha256,201605-201705,0.key
古いopensslコマンドだと-sha256オプションでエラーになることがある。 その場合は-sha1で代用すること。 幸い、CSRの署名でSHA1を使うことの是非はまだ問われてないので、本問題については古いシステムが無くなるまでスルーする。
実行結果例(RSA)
# openssl req -new -newkey rsa:2048 -nodes -sha256 ... Generating a 2048 bit RSA private key Generating a 2048 bit RSA private key .........................+++ .................................................+++ writing new private key to '/ssl/wiki.ninth-nine.com/wiki.ninth-nine.com,rsa2048-sha256,201605-201705,0.key' ----- # chmod 444 /ssl/wiki.ninth-nine.com/wiki.ninth-nine.com,rsa2048-sha256,201605-201705,0.csr # chmod 400 /ssl/wiki.ninth-nine.com/wiki.ninth-nine.com,rsa2048-sha256,201605-201705,0.key
CSR(RSA)ファイルの内容詳細
openssl req -noout -text -in /ssl/wiki.ninth-nine.com/wiki.ninth-nine.com,rsa2048-sha256,201605-201705,0.csr の実行結果。
Certificate Request: Data: Version: 0 (0x0) Subject: C=JP, ST=Tokyo, L=Suginami-ku, O=Ninth Nine, OU=System Division, CN=wiki.ninth-nine.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:b4:95:7b:83:f4:18:6d:79:06:79:6c:95:84:d8: a6:ba:40:ef:8c:db:75:41:fd:60:ab:00:e0:3c:08: 88:9e:0e:4e:07:92:14:b1:82:a7:7b:41:2b:18:c8: 1a:0f:3a:f0:c3:64:bc:2b:b6:34:1b:31:8c:49:b4: ba:b1:32:55:eb:f2:06:21:b1:4f:f3:c4:2d:8f:9b: 59:b9:4c:b2:9c:c0:09:ef:34:fb:0f:e9:13:b9:c7: de:79:7a:6b:27:bc:fa:1c:63:63:2f:6a:ca:40:0e: c4:63:24:1a:0e:66:60:c6:89:25:25:c8:a9:ab:a3: d0:d3:10:97:32:61:cc:71:f7:a6:31:ec:39:6a:1a: 48:df:de:66:e0:89:56:04:0d:42:37:98:a7:92:f2: c8:dc:3a:42:fb:42:6c:bf:2d:94:e6:6f:fc:c4:94: e1:ac:9a:82:e0:cc:d0:90:35:dd:63:68:e2:1c:60: b0:4e:6b:55:a0:b1:df:05:70:c4:f8:c6:71:64:31: 57:63:21:ef:b2:6f:24:b9:02:57:54:3d:3b:d6:4e: e0:f8:43:62:f0:d3:1c:de:2a:1e:3b:07:f6:88:10: f3:c4:b5:d5:20:39:1b:6a:81:85:85:e6:9e:ee:3f: ec:ce:cd:84:0f:3c:d9:de:7c:e8:c6:a7:c6:80:33: 1a:eb Exponent: 65537 (0x10001) Attributes: a0:00 Signature Algorithm: sha256WithRSAEncryption 89:f5:f7:0a:ce:08:53:8d:e9:dd:30:bc:09:f3:14:ac:21:c9: 2a:0e:46:0f:d5:d3:1b:f1:8d:4d:a6:6d:d3:42:78:86:36:69: 9f:5a:38:60:e7:21:64:f0:c7:ac:f9:c9:5c:15:c6:34:69:76: 6b:15:a0:87:23:3b:1b:01:f5:46:0e:76:60:b6:bf:52:86:64: 70:74:c9:e8:1c:df:c9:ff:6e:0f:9b:ef:3e:ff:a8:73:a2:36: cd:26:f5:a4:ce:a2:ea:5b:7d:21:bb:e3:2e:33:be:a9:bb:1c: f7:b9:e5:5a:96:d4:a1:60:6b:04:3d:fc:2b:27:12:0e:f0:e4: 34:ec:e0:45:8f:81:77:7d:a6:e3:66:0b:46:10:11:6d:26:34: a7:aa:7c:f6:76:00:53:bd:af:02:79:f8:f8:98:50:e6:6b:ea: b1:39:c8:54:88:c7:56:8e:f0:15:8e:6d:65:05:34:fd:3c:8f: d0:54:13:5f:54:3a:96:aa:69:a2:8b:99:b5:39:00:fa:8c:48: 3b:b5:e8:3f:9f:db:f0:e1:4b:54:8f:71:77:6b:6e:eb:9e:79: e1:6f:0c:44:51:1f:db:5d:77:56:c6:b1:87:f7:e8:bf:0f:e5: 30:f9:2f:ae:a9:c1:54:bb:1e:90:de:76:76:0c:8e:4e:77:1c: bf:59:06:e5
CSR(RSA)ファイルの内容
-----BEGIN CERTIFICATE REQUEST----- MIICxjCCAa4CAQAwgYAxCzAJBgNVBAYTAkpQMQ4wDAYDVQQIDAVUb2t5bzEUMBIG A1UEBwwLU3VnaW5hbWkta3UxEzARBgNVBAoMCk5pbnRoIE5pbmUxGDAWBgNVBAsM D1N5c3RlbSBEaXZpc2lvbjEcMBoGA1UEAwwTd2lraS5uaW50aC1uaW5lLmNvbTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALSVe4P0GG15BnlslYTYprpA 74zbdUH9YKsA4DwIiJ4OTgeSFLGCp3tBKxjIGg868MNkvCu2NBsxjEm0urEyVevy BiGxT/PELY+bWblMspzACe80+w/pE7nH3nl6aye8+hxjYy9qykAOxGMkGg5mYMaJ JSXIqauj0NMQlzJhzHH3pjHsOWoaSN/eZuCJVgQNQjeYp5LyyNw6QvtCbL8tlOZv /MSU4ayaguDM0JA13WNo4hxgsE5rVaCx3wVwxPjGcWQxV2Mh77JvJLkCV1Q9O9ZO 4PhDYvDTHN4qHjsH9ogQ88S11SA5G2qBhYXmnu4/7M7NhA882d586ManxoAzGusC AwEAAaAAMA0GCSqGSIb3DQEBCwUAA4IBAQCJ9fcKzghTjendMLwJ8xSsIckqDkYP 1dMb8Y1Npm3TQniGNmmfWjhg5yFk8Mes+clcFcY0aXZrFaCHIzsbAfVGDnZgtr9S hmRwdMnoHN/J/24Pm+8+/6hzojbNJvWkzqLqW30hu+MuM76puxz3ueValtShYGsE PfwrJxIO8OQ07OBFj4F3fabjZgtGEBFtJjSnqnz2dgBTva8Cefj4mFDma+qxOchU iMdWjvAVjm1lBTT9PI/QVBNfVDqWqmmii5m1OQD6jEg7teg/n9vw4UtUj3F3a27r nnnhbwxEUR/bXXdWxrGH9+i/D+Uw+S+uqcFUux6Q3nZ2DI5Odxy/WQbl -----END CERTIFICATE REQUEST-----
以上で作成が終るので、上記ファイルを認証局に申請する。ここより先は認証局次第なので以上とする。
秘密鍵(RSA)ファイルの内容詳細
openssl pkey -noout -text -in /ssl/wiki.ninth-nine.com/wiki.ninth-nine.com,rsa2048-sha256,201605-201705,0.csr の実行結果。
Private-Key: (2048 bit) modulus: 00:b4:95:7b:83:f4:18:6d:79:06:79:6c:95:84:d8: a6:ba:40:ef:8c:db:75:41:fd:60:ab:00:e0:3c:08: 88:9e:0e:4e:07:92:14:b1:82:a7:7b:41:2b:18:c8: 1a:0f:3a:f0:c3:64:bc:2b:b6:34:1b:31:8c:49:b4: ba:b1:32:55:eb:f2:06:21:b1:4f:f3:c4:2d:8f:9b: 59:b9:4c:b2:9c:c0:09:ef:34:fb:0f:e9:13:b9:c7: de:79:7a:6b:27:bc:fa:1c:63:63:2f:6a:ca:40:0e: c4:63:24:1a:0e:66:60:c6:89:25:25:c8:a9:ab:a3: d0:d3:10:97:32:61:cc:71:f7:a6:31:ec:39:6a:1a: 48:df:de:66:e0:89:56:04:0d:42:37:98:a7:92:f2: c8:dc:3a:42:fb:42:6c:bf:2d:94:e6:6f:fc:c4:94: e1:ac:9a:82:e0:cc:d0:90:35:dd:63:68:e2:1c:60: b0:4e:6b:55:a0:b1:df:05:70:c4:f8:c6:71:64:31: 57:63:21:ef:b2:6f:24:b9:02:57:54:3d:3b:d6:4e: e0:f8:43:62:f0:d3:1c:de:2a:1e:3b:07:f6:88:10: f3:c4:b5:d5:20:39:1b:6a:81:85:85:e6:9e:ee:3f: ec:ce:cd:84:0f:3c:d9:de:7c:e8:c6:a7:c6:80:33: 1a:eb publicExponent: 65537 (0x10001) privateExponent: 5f:1a:02:2c:61:d6:a3:80:83:2a:5b:46:fa:e9:66: 14:dc:b1:cb:8a:9f:dc:1a:e6:57:e8:64:2e:f9:87: 89:45:9b:4e:5d:5e:4c:85:b4:52:32:e5:d1:6d:40: 5c:18:fc:46:ca:bc:56:80:e4:3c:16:01:fd:a7:12: 52:d3:61:70:9a:cb:23:df:4f:6d:df:38:e7:52:37: 14:61:12:07:7f:13:3c:48:b8:97:8e:75:f6:f7:0d: 71:08:49:7a:6a:09:85:fd:c9:74:65:57:12:19:34: cf:c9:69:77:7f:ef:23:5f:82:92:bd:74:ad:91:de: 1d:e9:b4:d6:b1:ae:8b:ad:af:d9:ce:e3:f4:0b:93: d6:35:18:34:02:0f:5d:0a:62:f2:6e:f9:f3:94:4b: a0:af:d5:de:6a:0f:da:50:a0:3e:3a:22:e9:a2:66: 73:c6:11:df:1c:db:3e:44:c2:25:75:8c:41:d1:93: cf:e7:89:fd:dc:1d:cd:64:95:e1:66:fb:9f:cd:b2: 60:5f:21:86:98:c9:4f:e0:66:bc:00:6a:64:11:b8: 54:27:b9:0e:d6:29:1a:c1:28:c4:1b:ef:26:ee:d1: 2b:54:7b:d0:c5:aa:3d:ca:22:73:f9:b0:0f:94:99: b2:0c:4b:3a:16:f5:c1:05:88:4d:45:f0:5a:9e:06: 71 prime1: 00:de:e0:39:35:08:9b:70:66:37:0e:0b:5e:87:a4: cb:55:27:95:f0:b6:5b:80:26:17:68:13:e9:d7:d2: ef:ec:8f:65:7e:81:5c:20:a6:36:7e:d7:21:b2:8a: ec:1a:42:32:83:dc:f5:06:b8:92:1e:48:83:86:e8: 25:c0:77:96:f9:65:23:7b:6f:a2:48:86:71:0e:0f: db:b3:20:45:2c:80:d8:a9:62:16:01:c2:09:b3:3d: 82:68:be:b5:be:05:6e:b1:89:1c:d9:4e:a2:01:9f: 13:6a:e2:c6:ed:fe:f0:bc:4c:80:29:91:ce:84:62: 27:bf:c5:f0:df:08:7b:df:8f prime2: 00:cf:6c:2c:68:fb:5c:ef:47:0b:cd:b8:88:d8:da: 1a:b7:e7:7b:af:f1:d5:0b:d2:b9:f0:e2:fc:34:77: 38:e8:08:84:d3:4b:c5:80:f0:39:56:e1:48:89:fa: 6d:e1:9c:f6:ec:3f:b4:21:cb:2b:31:57:46:7b:87: 35:7b:b3:4e:14:64:28:1d:71:fb:54:5a:3e:8f:68: bd:cd:11:b8:e8:00:fa:67:aa:96:d8:26:db:27:b9: c4:a0:02:b7:93:70:90:c8:69:09:d6:24:fa:a9:ad: d8:e1:a4:5a:a0:eb:3d:60:e8:cb:51:b0:b2:a5:f2: ce:86:d7:1a:0b:da:49:e0:e5 exponent1: 6b:4e:c5:fc:74:d2:72:41:a4:8c:4c:89:0d:02:19: 2c:3c:cd:02:82:aa:77:7e:df:92:2a:d4:52:27:ab: 80:d8:61:e3:90:e1:0c:8f:3a:79:c3:96:e3:e1:e3: 5f:99:33:bd:2d:6b:83:fa:e5:cf:52:d6:90:e3:c1: 19:73:fa:ea:c4:f9:5a:7b:1b:45:94:05:66:e1:d7: c3:dc:eb:b1:4b:b0:05:8d:c6:4e:be:5f:f1:3e:d2: 45:20:5d:5c:ca:3c:cb:99:da:9b:fe:32:1e:59:ba: fd:a1:86:6a:1c:6f:48:1a:05:32:fe:92:d2:46:78: 20:eb:6a:d7:d7:bb:dc:9d exponent2: 77:37:02:13:58:9d:62:7d:20:00:9e:16:31:24:b2: 04:8f:0c:1c:e4:ce:81:1c:1d:78:a0:cd:39:ce:68: 2b:9c:71:d3:0b:92:b9:77:d8:4c:e1:f0:92:35:18: 20:7a:d9:c4:91:1c:93:eb:b4:a8:88:33:df:5d:a7: d4:b0:0a:a9:57:a3:62:c1:17:25:b5:34:8d:b2:32: 9c:81:9a:17:e6:30:05:93:1b:5d:a2:7f:85:46:95: 07:2e:68:9a:5a:31:2c:ae:8a:53:c5:2f:38:84:cd: c9:6a:70:18:5a:fc:0d:0d:df:85:d5:1b:e8:9b:34: 2e:75:c4:e7:99:0f:ab:2d coefficient: 3a:ac:25:84:c8:fb:0b:41:99:cb:cc:29:a2:aa:74: 6a:79:64:93:35:0c:ee:11:cb:f4:be:70:70:91:0b: 07:32:6e:8b:a9:93:79:59:1d:21:15:a9:fc:90:63: 9c:b1:75:75:79:fc:f3:2c:91:17:76:61:60:d8:bd: 60:28:4c:61:62:56:03:75:f5:4a:ee:38:1e:30:60: e2:15:ba:ee:cc:e5:9e:91:cc:ac:f0:b3:61:89:47: a9:1e:40:14:f0:33:06:71:24:cb:f3:d7:ad:ae:2e: d7:20:6a:6f:55:8c:10:14:f3:80:e4:31:ad:25:cd: 30:34:9d:d8:0f:74:12:42
RSA暗号の仕組みを参考に、 上記パラメータを変数に割り当てていくと、下記の通りになる。
- N = modulus
- p = prime1
- q = prime2
- e = publicExponent
- d = privateExponent
exponent1, exponent2, coefficient についてはノーコメントだ:-)。
秘密鍵(RSA)ファイルの内容
-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC0lXuD9BhteQZ5 bJWE2Ka6QO+M23VB/WCrAOA8CIieDk4HkhSxgqd7QSsYyBoPOvDDZLwrtjQbMYxJ tLqxMlXr8gYhsU/zxC2Pm1m5TLKcwAnvNPsP6RO5x955emsnvPocY2MvaspADsRj JBoOZmDGiSUlyKmro9DTEJcyYcxx96Yx7DlqGkjf3mbgiVYEDUI3mKeS8sjcOkL7 Qmy/LZTmb/zElOGsmoLgzNCQNd1jaOIcYLBOa1Wgsd8FcMT4xnFkMVdjIe+ybyS5 AldUPTvWTuD4Q2Lw0xzeKh47B/aIEPPEtdUgORtqgYWF5p7uP+zOzYQPPNnefOjG p8aAMxrrAgMBAAECggEAXxoCLGHWo4CDKltG+ulmFNyxy4qf3BrmV+hkLvmHiUWb Tl1eTIW0UjLl0W1AXBj8Rsq8VoDkPBYB/acSUtNhcJrLI99Pbd8451I3FGESB38T PEi4l4519vcNcQhJemoJhf3JdGVXEhk0z8lpd3/vI1+Ckr10rZHeHem01rGui62v 2c7j9AuT1jUYNAIPXQpi8m7585RLoK/V3moP2lCgPjoi6aJmc8YR3xzbPkTCJXWM QdGTz+eJ/dwdzWSV4Wb7n82yYF8hhpjJT+BmvABqZBG4VCe5DtYpGsEoxBvvJu7R K1R70MWqPcoic/mwD5SZsgxLOhb1wQWITUXwWp4GcQKBgQDe4Dk1CJtwZjcOC16H pMtVJ5XwtluAJhdoE+nX0u/sj2V+gVwgpjZ+1yGyiuwaQjKD3PUGuJIeSIOG6CXA d5b5ZSN7b6JIhnEOD9uzIEUsgNipYhYBwgmzPYJovrW+BW6xiRzZTqIBnxNq4sbt /vC8TIApkc6EYie/xfDfCHvfjwKBgQDPbCxo+1zvRwvNuIjY2hq353uv8dUL0rnw 4vw0dzjoCITTS8WA8DlW4UiJ+m3hnPbsP7QhyysxV0Z7hzV7s04UZCgdcftUWj6P aL3NEbjoAPpnqpbYJtsnucSgAreTcJDIaQnWJPqprdjhpFqg6z1g6MtRsLKl8s6G 1xoL2kng5QKBgGtOxfx00nJBpIxMiQ0CGSw8zQKCqnd+35Iq1FInq4DYYeOQ4QyP OnnDluPh41+ZM70ta4P65c9S1pDjwRlz+urE+Vp7G0WUBWbh18Pc67FLsAWNxk6+ X/E+0kUgXVzKPMuZ2pv+Mh5Zuv2hhmocb0gaBTL+ktJGeCDratfXu9ydAoGAdzcC E1idYn0gAJ4WMSSyBI8MHOTOgRwdeKDNOc5oK5xx0wuSuXfYTOHwkjUYIHrZxJEc k+u0qIgz312n1LAKqVejYsEXJbU0jbIynIGaF+YwBZMbXaJ/hUaVBy5omloxLK6K U8UvOITNyWpwGFr8DQ3fhdUb6Js0LnXE55kPqy0CgYA6rCWEyPsLQZnLzCmiqnRq eWSTNQzuEcv0vnBwkQsHMm6LqZN5WR0hFan8kGOcsXV1efzzLJEXdmFg2L1gKExh YlYDdfVK7jgeMGDiFbruzOWekcys8LNhiUepHkAU8DMGcSTL89etri7XIGpvVYwQ FPOA5DGtJc0wNJ3YD3QSQg== -----END PRIVATE KEY-----
※秘密鍵は「公開しないように」という注意を受けてるためか、どういうフォーマットか知られてないので掲載した。
※もちろん秘密鍵は「公開しないように」。
CSRの作成(ECDSA)
※opensslコマンドのオプションは長いので複数行に分割している。実際の実行は、1行(改行無し)で記述すること。
# openssl req -new -newkey ec:<(openssl ecparam -name prime256v1) -nodes -sha256 -subj "/C=JP/ST=Tokyo/L=Suginami-ku/O=Ninth Nine/OU=System Division/CN=wiki.ninth-nine.com" -out /ssl/wiki.ninth-nine.com/wiki.ninth-nine.com,prime256v1-sha256,201605-201705,0.csr -keyout /ssl/wiki.ninth-nine.com/wiki.ninth-nine.com,prime256v1-sha256,201605-201705,0.key # chmod 444 /ssl/wiki.ninth-nine.com/wiki.ninth-nine.com,prime256v1-sha256,201605-201705,0.csr # chmod 400 /ssl/wiki.ninth-nine.com/wiki.ninth-nine.com,prime256v1-sha256,201605-201705,0.key
※<(command)というイディオム(実行結果をテンポラリファイル名で渡してくれる)は zsh/bash 拡張なので、シェルスクリプト(sh/ash/ksh)中では使わないこと。
古いopensslコマンドだと-sha256オプションでエラーになることがある。 その場合は-sha1で代用すること。 幸い、CSRの署名でSHA1を使うことの是非は問われてないので、見なかったことにする。
ECDSAの場合、パラメータをファイルに落とし込んでおく必要がある。 よく知られたパラメータについては下記のように、ファイルに落とし込んでおく必要があるのかわからないくらい短い。 これはopenssl ecparamコマンドはデフォルトで-param_enc named_curveオプションが指定された状態であり、中身を確認するとバイナリ(ただの ASN.1 OID)だったりするのでファイル化する意味はあるのかも:-)。
-----BEGIN EC PARAMETERS----- BggqhkjOPQMBBw== -----END EC PARAMETERS-----
後から追加されたよく知られたパラメータを古い環境に持って行く必要がある場合、全てのパラメータを渡す必要がある。
openssl ecparam -name prime256v1 -param_enc explicit
-----BEGIN EC PARAMETERS----- MIH3AgEBMCwGByqGSM49AQECIQD/////AAAAAQAAAAAAAAAAAAAAAP////////// /////zBbBCD/////AAAAAQAAAAAAAAAAAAAAAP///////////////AQgWsY12Ko6 k+ez671VdpiGvGUdBrDMU7D2O848PifSYEsDFQDEnTYIhucEk2pmeOETnSa3gZ9+ kARBBGsX0fLhLEJH+Lzm5WOkQPJ3A32BLeszoPShOUXYmMKWT+NC4v4af5uO5+tK fA+eFivOM1drMV7Oy7ZAaDe/UfUCIQD/////AAAAAP//////////vOb6racXnoTz ucrC/GMlUQIBAQ== -----END EC PARAMETERS-----
もっともそんな事態(ましてやメジャーなパラメータで)が起こりうることは無いので、通常は考えなくてよいと思う。 ちなみにこの状態でCSRを作成すると、上記パラメータを全てCSRにぶち込むことになるので肥大化する。
対応しているパラメータについては以下の方法でリストアップ可能である。
openssl ecparam -list_curves
実行結果例(ECDSA)
# openssl req -new -newkey ec:<(openssl ecparam -name prime256v1) -nodes -sha256 ... Generating a 256 bit EC private key writing new private key to '/ssl/wiki.ninth-nine.com/wiki.ninth-nine.com,prime256v1-sha256,201605-201705,0.key' ----- # chmod 444 /ssl/wiki.ninth-nine.com/wiki.ninth-nine.com,prime256v1-sha256,201605-201705,0.csr # chmod 400 /ssl/wiki.ninth-nine.com/wiki.ninth-nine.com,prime256v1-sha256,201605-201705,0.key
CSR(ECDSA)ファイルの内容詳細
Certificate Request: Data: Version: 0 (0x0) Subject: C=JP, ST=Tokyo, L=Suginami-ku, O=Ninth Nine, OU=System Division, CN=wiki.ninth-nine.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) pub: 04:3c:be:37:69:d9:d7:8f:2e:fb:04:14:a0:e9:2e: 26:5e:d2:bc:bb:fc:45:4b:c0:23:d3:0f:9a:fb:38: dd:83:c7:dd:5c:a3:73:05:10:14:be:35:18:ab:90: ec:81:7f:ca:60:07:3b:5a:25:92:e5:fa:e9:5e:f6: a8:78:b2:c0:2f ASN1 OID: prime256v1 NIST CURVE: P-256 Attributes: a0:00 Signature Algorithm: ecdsa-with-SHA256 30:46:02:21:00:d0:ef:42:ad:e5:57:a6:5b:f4:b8:2f:32:5e: 59:b9:60:5a:a9:b4:9c:2b:52:d4:bb:4a:ca:74:46:62:4d:9d: 6a:02:21:00:99:f8:18:ef:00:cf:a4:bd:15:83:bf:58:9a:d5: c0:07:21:f7:93:03:11:56:81:bf:ae:68:2e:2e:10:dd:cf:29
CSR(ECDSA)ファイルの内容
-----BEGIN CERTIFICATE REQUEST----- MIIBPTCB4wIBADCBgDELMAkGA1UEBhMCSlAxDjAMBgNVBAgMBVRva3lvMRQwEgYD VQQHDAtTdWdpbmFtaS1rdTETMBEGA1UECgwKTmludGggTmluZTEYMBYGA1UECwwP U3lzdGVtIERpdmlzaW9uMRwwGgYDVQQDDBN3aWtpLm5pbnRoLW5pbmUuY29tMFkw EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPL43adnXjy77BBSg6S4mXtK8u/xFS8Aj 0w+a+zjdg8fdXKNzBRAUvjUYq5DsgX/KYAc7WiWS5frpXvaoeLLAL6AAMAoGCCqG SM49BAMCA0kAMEYCIQDQ70Kt5VemW/S4LzJeWblgWqm0nCtS1LtKynRGYk2dagIh AJn4GO8Az6S9FYO/WJrVwAch95MDEVaBv65oLi4Q3c8p -----END CERTIFICATE REQUEST-----
以上で作成が終るので、上記ファイルを認証局に申請する。ここより先は認証局次第なので以上とする。
秘密鍵(ECDSA)ファイルの内容詳細
openssl pkey -noout -text -in /ssl/wiki.ninth-nine.com/wiki.ninth-nine.com,prime256r1-sha256,201605-201705,0.csr の実行結果。
Private-Key: (256 bit) priv: 68:2f:ee:8a:2b:41:9b:81:00:67:64:5b:64:7f:1c: fc:0f:fa:85:c5:85:0f:b0:28:b0:16:52:23:ca:11: 27:13 pub: 04:3c:be:37:69:d9:d7:8f:2e:fb:04:14:a0:e9:2e: 26:5e:d2:bc:bb:fc:45:4b:c0:23:d3:0f:9a:fb:38: dd:83:c7:dd:5c:a3:73:05:10:14:be:35:18:ab:90: ec:81:7f:ca:60:07:3b:5a:25:92:e5:fa:e9:5e:f6: a8:78:b2:c0:2f ASN1 OID: prime256v1 NIST CURVE: P-256
秘密鍵(ECDSA)ファイルの内容
-----BEGIN PRIVATE KEY----- MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgaC/uiitBm4EAZ2Rb ZH8c/A/6hcWFD7AosBZSI8oRJxOhRANCAAQ8vjdp2dePLvsEFKDpLiZe0ry7/EVL wCPTD5r7ON2Dx91co3MFEBS+NRirkOyBf8pgBztaJZLl+ule9qh4ssAv -----END PRIVATE KEY-----
拡張要求(Requested Extensions)の指定方法
CSRにはいくつかの属性を付与して認証局に申請することができる。
SANs
SANs(Subject Alternative Name)を指定する場合。
マルチドメイン証明書は本機能を使用して実現している。 シングルドメイン証明書でも例えば、サブドメイン(www.example.jp)で申請した際に上位ドメイン(example.jp)を含有するようなケースでも使用している。
OCSP MUST STAPLE
OCSP Staplingを強制(ソフトフェイルのところをハードフェイルに変える)にする場合の指定方法について。 その前にユースケースを確認。
- SSL/TLSサーバーである(Webサーバーとは限らない)。
- No:※まぁ前提条件なのでNoのケースについては扱わず
- Yes:対応するクライアントはOCSP(証明書が失効してないか随時確認)してる。
- No:サーバー側で頑張んなくていいです(本ケース適用外)。
- Yes:当該SSL/TLSサーバーはOCSP Staplingに対応してる。
- No:対応してないならこの設定しちゃダメです(本ケース適用外)。
- Yes:証明書失効確認できなかったら、サービスが止まっても問題無いと考える意識高い系の人である。
- No:特に設定しなくていいです。設定したいならトレードオフについては注意(後述)してね。
- Yes:本設定の対象となります。
これ設定すると、OCSPレスポンダーが止まってたら通信できないけどいいよね。
Webサーバーのように、OCSP Staplingサポートが充実したSSL/TLSサーバーで運用する場合に設定します。 それ以外(メールサーバー等)のサーバーではそもそもOCSP Staplingを実装してないことがあるので、 同じ証明書を違うサーバーで共有するケースでは設定しない方がいいです。
下準備として下記のファイルを用意します。
[req] distinguished_name=req [reqexts] 1.3.6.1.5.5.7.1.24=DER:30:03:02:01:05
下記のように動的に生成してもいいです。
echo "[req]\ndistinguished_name=req"; echo "[reqexts]\n1.3.6.1.5.5.7.1.24=DER:30:03:02:01:05"
CSR作成時のオプションに下記を加えてやれば作成できます。 長いので複数行に分けていますが、コマンドラインでは改行せず入力してください。
-reqexts reqexts -config <(echo "[req]\ndistinguished_name=req"; echo "[reqexts]\n1.3.6.1.5.5.7.1.24=DER:30:03:02:01:05")
※<(command)というイディオム(実行結果をテンポラリファイル名で渡してくれる)は zsh/bash 拡張なので、シェルスクリプト(sh/ash/ksh)中では使わないこと。
できあがったCSRファイルを openssl req -noout -text してやると以下の三行が追加されることが確認できれば設定に問題ありません。
Requested Extensions: 1.3.6.1.5.5.7.1.24: 0....
1.3.6.1.5.5.7.1.24 というOIDについてやら、実際に設定する値については参考文献見てください。
良くある質問とその答え
Q.サーバーがOCSP Staplingに対応してるか確認する方法は?
A.勝利の鍵は -status オプションだ!
openssl s_client のオプションに -status というオプションを加えるだけで確認できる。
A.OCSP Staplingに対応しているWebサーバーの例
$ openssl s_client -connect Webサーバー:https -status < /dev/null : OCSP response: ====================================== OCSP Response Data: OCSP Response Status: successful (0x0) Response Type: Basic OCSP Response Version: 1 (0x0) Responder Id: C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3 Produced At: Aug 13 19:17:00 2018 GMT Responses: Certificate ID: Hash Algorithm: sha1 Issuer Name Hash: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Issuer Key Hash: YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY Serial Number: ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ Cert Status: good This Update: Aug 13 19:00:00 2018 GMT Next Update: Aug 20 19:00:00 2018 GMT Signature Algorithm: sha256WithRSAEncryption AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA: AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA: AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA: AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA: AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA: AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA: AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA: AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA: AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA: AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA: AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA: AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA: AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA: AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA: AA:AA:AA:AA ====================================== :
A.OCSP Staplingに対応していないSMTPサーバーの例
$ openssl s_client -connect メールサーバー:smtp -status -starttls smtp < /dev/null CONNECTED(00000003) OCSP response: no response sent :