サイズ: 19236
コメント:
|
サイズ: 19231
コメント:
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 3: | 行 3: |
* [[https://letsencrypt.jp|Let's Encrypt]](以後レッツと省略)の場合はまた別手順となるので[[wiki:SSL証明書/Let's EncryptでSSL証明書の新規取得と自動更新|そちら]]で解説する。 | * [[https://letsencrypt.jp|Let's Encrypt]](以後レッツと省略)の場合はまた別手順となるので[[SSL証明書/Let's EncryptでSSL証明書の新規取得と自動更新|そちら]]で解説する。 |
SSLサーバー証明書の作り方
- ここでは一般的なCSRの作成方法について解説する。
Let's Encrypt(以後レッツと省略)の場合はまた別手順となるのでそちらで解説する。
- 自己署名証明書、いわゆる俺々証明書はまた別の情報が必要となるため、こちらも別途解説する。
- SSLサーバー証明書の利用に当たり、レッツの採用についてはトレードオフが発生する。よく考えて選択すること。
- ターゲットとするクライアントが対応しているかどうか。
PC向けとしてはXP対応も考慮されてるとのこと(ルート認証局は IdenTrust DST Root CA X3)。
- フューチャーフォン(KDDI端末については全滅なのを確認)や一部Android端末については未対応である。
- DV(Domain Validation)ではなく、OV(Organization Validation)やEV(Extended Validation)な証明書が必要なら選択の余地無し。
- SSLアクセラレータなど、機器の中の秘密鍵が取り出せないケース(HSM - Hardware Security Module)。このケースは本手順も適用できない。
- 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 |
|
RSAの3072bit, 4096bitの時の署名アルゴリズムがSHA-2 384bitが妥当(トレンド的に)かはわからなかった。 というのも4096bitが当然の時代にはおそらくSHA-3(256bit)が登場していると思われる(2016年現在検証フェーズ)。 とは言え、RSA4096bit/SHA384なルート証明書が存在するので、一概に否定するモノでは無いと考えている(眉唾とは見てるけど)。
ECDSAは同じ鍵長(例えば 256bit だとしても)でも選ぶ楕円曲線系によって違うという話なので「パラメータ」を指定してやる必要がある。 これは例えばECDSA 256bitという情報だけでは証明書を作れないことを意味する。 鍵長自体は 256bit, 384bit, 521bit(512 ではなく 521)が一般的だが、どの「パラメータ」を採用するのが一般的なのかはよくわからなかった。 もちろんOpenSSLなら何を選んでも大丈夫とのことだが、相互運用を考えると、とてもとても信用できる話ではなく…。
若干古ので今の事情に合ってるか不明だが、情報セキュリティ技術動向調査(2010年上期)楕円曲線暗号の整備動向より、それぞれ prime256v1/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
また、必要な項目は認証局毎に違うので事前に調査すること。 特にDV(Domain Validation)で都道府県以下が必要になることは無い。
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)ファイルの内容詳細
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:aa:28:7e:d7:0a:16:11:d8:38:09:92:9c:55:74: e0:ac:79:e0:c3:7f:16:85:72:4f:4d:34:d1:df:3d: e3:5d:35:a7:b7:42:e3:71:e0:aa:8e:d6:1e:65:4c: 6a:9f:ef:eb:7d:69:f1:3b:15:e5:77:f1:bb:15:41: f8:b2:74:08:7e:ca:10:ec:89:c2:6d:64:9e:4c:23: 72:f5:ad:1e:52:68:e8:13:04:72:d2:35:4b:80:fa: 8b:92:a8:bb:eb:81:38:e0:f0:8e:56:21:13:0f:02: 73:10:50:b4:2c:0e:3c:7e:ec:32:f6:77:eb:01:08: f5:fa:99:98:4a:6d:d6:9c:5a:ef:53:43:96:36:ca: dd:6d:c9:96:be:fc:80:77:b7:ec:c0:76:56:a3:6e: 65:2c:26:b7:ca:b3:df:cb:37:3d:a2:16:03:78:25: 18:e5:81:a0:04:5f:36:45:67:8e:63:81:f3:e9:0e: c4:18:04:1a:d6:34:dd:b1:7e:66:5c:f4:05:34:ae: 14:57:2b:e8:65:e3:5d:8d:2e:6f:f0:d5:21:eb:52: d3:9b:2b:f5:3a:1f:58:fb:68:c6:b6:03:ad:74:f7: ec:c7:6e:2e:7c:1d:d1:b3:89:2c:c5:1b:fd:69:cd: 73:fa:ff:4a:d8:a8:15:80:77:73:8e:3f:37:89:ad: 17:25 Exponent: 65537 (0x10001) Attributes: a0:00 Signature Algorithm: sha256WithRSAEncryption 9e:70:f7:07:59:57:49:e7:27:be:08:cf:44:6f:ff:56:e6:57: fd:60:db:24:21:6a:9e:53:ff:de:29:69:66:bf:1c:64:2c:c5: 3c:91:d2:4a:2e:66:e9:27:92:e0:83:5e:c8:1a:cf:18:eb:e4: 00:cf:84:68:79:7b:53:1e:31:93:bd:1f:9a:08:05:d0:d5:02: ff:a4:65:c6:a5:3b:50:98:de:b8:23:82:d0:35:27:e6:b9:28: 24:e0:75:f5:d0:39:95:11:e1:12:ce:38:8b:74:94:4f:57:b4: e9:10:79:17:6a:30:39:f1:38:47:64:ba:be:24:0b:a1:8e:3f: 99:37:a8:72:ec:ad:ab:37:6d:1a:b0:d4:8b:91:bc:5b:bf:cf: 0f:35:dc:8d:7f:77:e0:71:86:d4:97:70:21:57:a1:5f:21:e6: 80:17:5e:a3:5a:ea:96:43:4b:88:f2:57:22:4b:4a:71:3a:f7: ef:84:0b:e5:fb:e4:fb:db:cc:c6:f3:b8:ce:7b:9c:b6:c2:6c: 27:fa:ea:3f:6c:5d:bb:00:5e:ab:3e:51:70:e5:35:c1:3d:f3: b2:99:1e:87:f0:31:9f:bd:27:64:28:66:8c:a0:86:90:8a:82: 70:1c:ca:28:d2:e5:4b:76:de:1d:18:a5:05:93:dd:8f:57:2f: 67:76:71:58
CSR(RSA)ファイルの内容
-----BEGIN CERTIFICATE REQUEST----- MIICxjCCAa4CAQAwgYAxCzAJBgNVBAYTAkpQMQ4wDAYDVQQIDAVUb2t5bzEUMBIG A1UEBwwLU3VnaW5hbWkta3UxEzARBgNVBAoMCk5pbnRoIE5pbmUxGDAWBgNVBAsM D1N5c3RlbSBEaXZpc2lvbjEcMBoGA1UEAwwTd2lraS5uaW50aC1uaW5lLmNvbTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKooftcKFhHYOAmSnFV04Kx5 4MN/FoVyT0000d894101p7dC43Hgqo7WHmVMap/v631p8TsV5XfxuxVB+LJ0CH7K EOyJwm1knkwjcvWtHlJo6BMEctI1S4D6i5Kou+uBOODwjlYhEw8CcxBQtCwOPH7s MvZ36wEI9fqZmEpt1pxa71NDljbK3W3Jlr78gHe37MB2VqNuZSwmt8qz38s3PaIW A3glGOWBoARfNkVnjmOB8+kOxBgEGtY03bF+Zlz0BTSuFFcr6GXjXY0ub/DVIetS 05sr9TofWPtoxrYDrXT37MduLnwd0bOJLMUb/WnNc/r/StioFYB3c44/N4mtFyUC AwEAAaAAMA0GCSqGSIb3DQEBCwUAA4IBAQCecPcHWVdJ5ye+CM9Eb/9W5lf9YNsk IWqeU//eKWlmvxxkLMU8kdJKLmbpJ5Lgg17IGs8Y6+QAz4RoeXtTHjGTvR+aCAXQ 1QL/pGXGpTtQmN64I4LQNSfmuSgk4HX10DmVEeESzjiLdJRPV7TpEHkXajA58ThH ZLq+JAuhjj+ZN6hy7K2rN20asNSLkbxbv88PNdyNf3fgcYbUl3AhV6FfIeaAF16j WuqWQ0uI8lciS0pxOvfvhAvl++T728zG87jOe5y2wmwn+uo/bF27AF6rPlFw5TXB PfOymR6H8DGfvSdkKGaMoIaQioJwHMoo0uVLdt4dGKUFk92PVy9ndnFY -----END CERTIFICATE REQUEST-----
以上で作成が終るので、上記ファイルを認証局に申請する。ここより先は認証局次第なので以上とする。
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の場合、パラメータをファイルに落とし込んでおく必要がある。 よく知られたパラメータについては下記のように、ファイルに落とし込んでおく必要があるのかわからないくらい短い。 これは-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:59:f2:7f:24:98:76:c4:54:09:90:b4:39:48:02: f3:c9:1f:61:d7:84:48:3f:78:fb:45:71:14:4e:e4: 63:18:29:82:ad:4b:e3:fa:62:ca:46:2f:e6:48:52: 26:ce:e2:55:78:91:7f:df:ba:cb:f7:2f:2f:92:3f: c8:7e:09:87:a2 ASN1 OID: prime256v1 Attributes: a0:00 Signature Algorithm: ecdsa-with-SHA256 30:45:02:21:00:90:0d:dd:54:af:7f:40:c2:78:2f:d7:86:4b: b2:12:4a:f8:01:19:38:0f:fe:53:fb:37:a8:fc:68:fc:6c:f3: b3:02:20:57:a4:a2:50:06:18:65:28:53:e7:4f:24:2f:76:af: 13:a4:1f:b8:e0:c4:ac:41:70:13:f9:b8:f8:14:2a:92:47
CSR(ECDSA)ファイルの内容
-----BEGIN CERTIFICATE REQUEST----- MIIBPDCB4wIBADCBgDELMAkGA1UEBhMCSlAxDjAMBgNVBAgMBVRva3lvMRQwEgYD VQQHDAtTdWdpbmFtaS1rdTETMBEGA1UECgwKTmludGggTmluZTEYMBYGA1UECwwP U3lzdGVtIERpdmlzaW9uMRwwGgYDVQQDDBN3aWtpLm5pbnRoLW5pbmUuY29tMFkw EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWfJ/JJh2xFQJkLQ5SALzyR9h14RIP3j7 RXEUTuRjGCmCrUvj+mLKRi/mSFImzuJVeJF/37rL9y8vkj/IfgmHoqAAMAoGCCqG SM49BAMCA0gAMEUCIQCQDd1Ur39Awngv14ZLshJK+AEZOA/+U/s3qPxo/GzzswIg V6SiUAYYZShT508kL3avE6QfuODErEFwE/m4+BQqkkc= -----END CERTIFICATE REQUEST-----
以上で作成が終るので、上記ファイルを認証局に申請する。ここより先は認証局次第なので以上とする。