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のみとなる。

拡張子

拡張子については諸説流派があるので、ルール化する。

拡張子

意味

備考

.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を使うことの是非は問われてないので、古いシステムが無くなるまでスルーする。

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

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

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

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

参考文献