2と3のリビジョン間の差分
2016-05-05 16:25:50時点のリビジョン2
サイズ: 18889
コメント:
2016-05-05 16:27:15時点のリビジョン3
サイズ: 18956
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 58: 行 58:
拡張子については諸説流派があるので、ルール化する。

||<#FFFF00> 拡張子 ||<#FFFF00> 意味 ||<#FFFF00> 備考 ||
|| .crt || 署名済みSSL公開鍵証明書 || ||
|| .csr || SSL公開鍵証明書(署名リクエスト) || ||
|| .key || SSL秘密鍵 || ||
|| .p12 || PKCS#12形式 || コンテナ      ||
拡張子については諸説流派(.pem 派 V.S. .crt 派)があるので、以下にルール化する。

||<#FFFF00> 拡張子 ||<#FFFF00> 意味 ||<#FFFF00> 備考      ||
|| .crt || 署名済みSSL公開鍵証明書 ||      ||
|| .csr || SSL公開鍵証明書(署名リクエスト) ||      ||
|| .key || SSL秘密鍵 ||      ||
|| .p12 || PKCS#12形式 || コンテナとして使用 ||

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,csr
  -keyout /ssl/wiki.ninth-nine.com/wiki.ninth-nine.com,rsa2048-sha256,201605-201705,key

# chmod 444 /ssl/wiki.ninth-nine.com/wiki.ninth-nine.com,rsa2048-sha256,201605-201705,csr
# chmod 400 /ssl/wiki.ninth-nine.com/wiki.ninth-nine.com,rsa2048-sha256,201605-201705,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,key'
-----
# chmod 444 /ssl/wiki.ninth-nine.com/wiki.ninth-nine.com,rsa2048-sha256,201605-201705,csr
# chmod 400 /ssl/wiki.ninth-nine.com/wiki.ninth-nine.com,rsa2048-sha256,201605-201705,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,csr
  -keyout /ssl/wiki.ninth-nine.com/wiki.ninth-nine.com,prime256v1-sha256,201605-201705,key

# chmod 444 /ssl/wiki.ninth-nine.com/wiki.ninth-nine.com,prime256v1-sha256,201605-201705,csr
# chmod 400 /ssl/wiki.ninth-nine.com/wiki.ninth-nine.com,prime256v1-sha256,201605-201705,key

※<(command)というイディオム(実行結果をテンポラリファイル名で渡してくれる)は zsh/bash 拡張なので、シェルスクリプト(sh/ash/ksh)中では使わないこと。

古いopensslコマンドだと-sha256オプションでエラーになることがある。 その場合は-sha1で代用すること。 幸い、CSRの署名でSHA1を使うことの是非は問われてないので、古いシステムが無くなるまでスルーする。

ECDSAの場合、パラメータをファイルに落とし込んでおく必要がある。 よく知られたパラメータについては下記のように、ファイルに落とし込んでおく必要があるのかわからないくらい短い。 これは-param_enc named_curveオプションが指定された状態であり、中身を確認するとバイナリだったので意味はあるのかも:-)。

-----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-----

もっともそんな事態(ましてやメジャーなパラメータで)が起こりうることは無いので、通常は考えなくてよいと思う。

対応しているパラメータについては以下の方法でリストアップ可能である。

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,key'
-----
# chmod 444 /ssl/wiki.ninth-nine.com/wiki.ninth-nine.com,prime256v1-sha256,201605-201705,csr
# chmod 400 /ssl/wiki.ninth-nine.com/wiki.ninth-nine.com,prime256v1-sha256,201605-201705,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: 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(RSA)ファイルの内容

-----BEGIN CERTIFICATE REQUEST-----
MIIBPDCB4wIBADCBgDELMAkGA1UEBhMCSlAxDjAMBgNVBAgMBVRva3lvMRQwEgYD
VQQHDAtTdWdpbmFtaS1rdTETMBEGA1UECgwKTmludGggTmluZTEYMBYGA1UECwwP
U3lzdGVtIERpdmlzaW9uMRwwGgYDVQQDDBN3aWtpLm5pbnRoLW5pbmUuY29tMFkw
EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWfJ/JJh2xFQJkLQ5SALzyR9h14RIP3j7
RXEUTuRjGCmCrUvj+mLKRi/mSFImzuJVeJF/37rL9y8vkj/IfgmHoqAAMAoGCCqG
SM49BAMCA0gAMEUCIQCQDd1Ur39Awngv14ZLshJK+AEZOA/+U/s3qPxo/GzzswIg
V6SiUAYYZShT508kL3avE6QfuODErEFwE/m4+BQqkkc=
-----END CERTIFICATE REQUEST-----

以上で作成が終るので、上記ファイルを認証局に申請する。ここより先は認証局次第なので以上とする。

参考文献

certificate/サーバー証明書の作り方 (最終更新日時 2019-05-20 15:24:29 更新者 NorikatsuShigemura)