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のみとなる。
拡張子
拡張子については諸説流派があるので、ルール化する。
拡張子 |
意味 |
備考 |
.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
以上で作成が終るので、認証局に申請を上げる。ここより先は認証局次第なので以上とする。