サーバー証明書の作り方

準備

ディレクトリ・ファイル構成

ここでは以下の通りの構成で証明書を管理するモノとする。 環境によってはここまで頑張らなくてもよい。 が、せめてオーナー・パーミッションには気を遣おう。

用途

パス名

オーナー

パーミッション

備考

証明書管理ディレクトリトップ

/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暗号の仕組みを参考に、 上記パラメータを変数に割り当てていくと、下記の通りになる。

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を強制(ソフトフェイルのところをハードフェイルに変える)にする場合の指定方法について。 その前にユースケースを確認。

これ設定すると、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
  :

参考文献

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