SSL/TLS証明書の作成手順 (2015)

今度はちゃんと作ろっ

先日弊社Webサーバの証明書更新通知がとんできたので、更新作業を行うにあたり手順を整理する事にしました。いつものごとく備忘録兼ねて記事化します。
SHA1は2016年廃止予定ですので、SHA2(sha256)対応の手順になります。

はじめに

サイトのSSL/TLS証明書の有効期限が迫ってきたので、更新作業を行う事に。

証明書を作成するにあたって、ここのところのトピックスとしてはSHA1の廃止というものがあります。

SHA-1廃止を前倒し? MicrosoftやMozillaが検討

暫く前までは2017/1 に廃止予定という話だった気がしますが、

SHA-1を使った証明書の受け入れ廃止時期を早ければ2016年6月~7月に前倒しすることを検討している。

との事。

この点を踏まえた手順に従うべきでしょう。

以下、作成される各種ファイル ( 秘密鍵、CSR、証明書 ) の確認方法含めてまとめてみます。


自己証明書 ( オレオレ証明書 ) の作成も行って、SHA2 対応できている事を確認しているので、自己証明書の作成手順としても使えると思います。 ( インストール方法は書いていませんが )

※最近書かれた(と思われる)ブログ等でも、SHA2 非対応だったり、鍵長が足りない手順書いてあるの見かけるけど、、、

※当然、この記事に関してもそのうち時代遅れになります。

環境

環境は以下です。 openssl のバージョンや設定にもよりますが、Linux 環境であれば同様の手順が使えると思います。

OS Amazon Linux ( 64bit )
openssl openssl-1.0.1k-10.87.amzn1

手順 (概要)

証明書を発行してもらうまでの手順を記します。

証明書の作成を行った事がある方ならば今更でしょうが、

  1. 秘密鍵を作成し
  2. 作成した秘密鍵からCSR (certificate signing request : 証明書署名要求) を作成します

通常は上記CSRをVerisign等の認証機関に送付してサーバ証明書を作成する事になります。

ここでは、Webサーバの SSL/TLS 設定 (2015/5) に書いた「推奨セキュリティ型の要求設定」における「サーバ証明書の要求設定」を満たす証明書を作成するものとします。

幾つかの要求設定がありますが、今回の手順は以下を満たすものとします。

  • SHA-256が使えることが必須条件
  • サーバ証明書発行・更新要求の際に生成する鍵のアルゴリズム/鍵長は
    RSAで鍵長は2048ビット以上
  • 認証局が発行するサーバ証明書の署名アルゴリズム/鍵長は
    RSA署名とSHA-256の組合せで2048ビット以上

秘密鍵の作成

秘密鍵の作成手順を示します。

openssl コマンドを利用して以下のようにします。

条件を満たす鍵長を指定しましょう。指定しない場合のデフォルトは1024 になります ( 上記環境の場合 )。

# openssl genrsa 2048 > www.sample.co.jp.key

※ www.sample.co.jp.key がキーファイルになります。ファイル名に関しては適宜変更して下さい。( 以下同様 )

※ここでは鍵長に 2048 ビットを指定しています。

秘密鍵をパスフレーズで保護する場合

※秘密鍵のパスフレーズでの保護は、運用手順が煩雑になるため行わない場合も多いと思います。
パスフレーズによる保護は必要に応じてどうぞ。

秘密鍵をパスフレーズで保護する場合、暗号化するためのオプションを追加します。
-des, -des3, -aes128, -aes192, -aes256 等が選択可能です。

# openssl genrsa -aes256 2048 > www.sample.co.jp.key

擬似乱数ファイルの指定

秘密鍵生成のための擬似乱数ファイルを指定する事も可能です。

# openssl genrsa -aes256 2048 -rand rand.dat > www.sample.co.jp.key

上では rand.dat というファイルを指定しています。
擬似乱数ファイルは以下のような方法で作成可能です。

参考 : Apache + OpenSSL CSR生成手順 (新規)

# cd ....
# openssl md5 * > rand.dat

適当なディレクトリに移動し上記コマンドを実行する事で、ディレクトリ中のファイルの md5値を rand.dat に出力しています。
ファイルが存在しないディレクトリで実行しても意味がないので、適当なファイルのあるディレクトリに移動して実行すればよいでしょう。

後からパスフレーズを設定(追加/変更、または、解除)する

以下で可能です。パーミッション設定によってはエラーとなるので、その際は先に chmod して下さい。

# ssh-keygen -p -f www.sample.co.jp.key

パーミッションの設定

作成した秘密鍵には適切なパーミッションを設定して下さい。
また必要に応じてバックアップも取りましょう。バックアップファイル含めて権限管理は適切に

※ 秘密鍵ファイル以外に関しても適切なパーミッションの設定、及び、バックアップを忘れずに (以下ファイル作成手順では省略)

# chmod 400 www.sample.co.jp.key

秘密鍵ファイルの確認

秘密鍵ファイルの確認は以下で行えます。

※パスフレーズで保護した場合、パスフレーズの入力を求められます。

# openssl rsa -text < www.sample.co.jp.key
Private-Key: (2048bit)
modulus:
(中略)
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
(中略)
-----END RSA PRIVATE KEY-----

鍵長及び、アルゴリズムに問題ないか確認できます。

CSRの作成

CSRの作成手順を示します。

openssl コマンドを利用して以下のようにします。

ポイントは -sha256 オプションです。デフォルトではSHA1のため -sha256 オプションを付けています。

# openssl req -new -sha256 -key www.sample.co.jp.key -out www.sample.co.jp.csr

以下幾つかの入力を求められるので応答します。

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Bunkyo-ku
Organization Name (eg, company) [Default Company Ltd]:Agile Company Limited.
Organizational Unit Name (eg, section) []:xx Section
Common Name (eg, your name or your server's hostname) []:www.agilegroup.co.jp
Email Address []:xxxx@agilegroup.co.jp

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

CSRファイルの確認

以下で行えます。

# openssl req -noout -text -in www.sample.co.jp.csr

sha256 オプションを付けた場合、Signature Algorithm の値は以下のように出力されているはずです。(抜粋)

            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
    (中略)
    Signature Algorithm: sha256WithRSAEncryption
         xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:

Public-Key のサイズも確認しておきましょう。

ちなみに-sha256オプションを付けない場合、以下のようになりました。

    Signature Algorithm: sha1WithRSAEncryption

秘密鍵とCSRを同時に作成する

以下のようにして秘密鍵とCSRを同時に生成する事も可能です。

  • 例1)
    # openssl req -new -newkey rsa:2048 -nodes -sha256 -out www.sample.co.jp.csr -keyout www.sample.co.jp.key
    
  • 例2)
    # openssl req -new -newkey rsa:2048 -nodes -sha256 -out www.sample.co.jp.sha256.csr -keyout www.sample.co.jp.key -subj "/C=JP/ST=Tokyo/L=Bunkyo-ku/O=Agile Company Limited./CN=www.agilegroup.co.jp" 
    

証明書の作成

上記までの手順で作成された CSR を利用して証明書発行の依頼をおこなえばOKですが、一応(自己=オレオレ)証明書の作成手順も示しておきます。

openssl コマンドを利用して以下のようにします。
ここでも -sha256 を指定しています。

# openssl x509 -days 365 -sha256 -in www.sample.co.jp.csr -out www.sample.co.jp.crt -req -signkey www.sample.co.jp.key

証明書ファイルの確認

以下で行えます。

# openssl x509 -in www.sample.co.jp.crt -noout -text

-text オプション部分を変更する事で個別の情報を出力する事も可能です。
( -subject, -email, -dates ... 等 )

ファイル間の整合性確認

複数の証明書を発行する作業等を行った場合に、どの鍵とどの証明書が対応しているのか判らなくなったりする場合があるかもしれません。

modulus の値が同じか確認

こういった場合、modulus の値が同じかどうかを確認する事で、鍵と証明書の対応確認が行えます。

# diff <(openssl rsa -in www.sample.co.jp.key -modulus -noout) <(openssl x509 -in www.sample.co.jp.crt -modulus -noout)

上では二つのコマンドの出力結果の diff をとっています。同じであれば何も出力されません。

「結果が見えないと不安だ」という場合

# openssl rsa -in www.sample.co.jp.key -modulus -noout | openssl md5
# openssl x509 -in www.sample.co.jp.crt -modulus -noout | openssl md5

としてそれぞれのハッシュ値が同一かどうかで確認するとかすればよいでしょう。

公開鍵が同じか確認

modulus が同じなら確認する必要もないかと思いますが、公開鍵が同一かどうかは以下のコマンドで確認できます。

# diff <(openssl rsa -in www.sample.co.jp.key -pubout) <(openssl x509 -in www.sample.co.jp.crt -pubkey -noout)

Webブラウザでの確認

証明書をインストールしたら、動作に問題ないかも確認しましょう。

以下は証明書をインストールしたWebサーバ(apache)にWebブラウザ (Chrome)でアクセスして ( 自己 ) 証明書情報を確認した場合の例です。

余力がある方は、ビット数や -sha256オプションを指定しない場合にどうなるかも試してみてもいいかもしれません。
上図のハッシュアルゴリズムや公開キーのBit数が変わる事を確認できるはずです。

まとめ

というわけで、( 多分 ) 今風の証明書作成手順でした。

証明書の更新手続きも完了。疲れた。(--;

SSL Server Test (Powered by Qualys SSL Labs) でも 一応 A+ 判定頂きました。