SSL通信をするための設定手順概要

WebサーバがSSL通信をするための設定について概要をまとめました。

まずは電子証明書(SSLサーバ証明書)を取得する必要があります。

CSRの作成
CSRとはSSLサーバ証明書を発行するための証明書署名要求のことです。
これは電子データなのでマシン上で作成します。

1.秘密鍵の作成
キー長 2048bit、ファイル名 private.key の秘密鍵を作成します。
# ./openssl  genrsa  -des3  -out  private.key  2048
パスフレーズの入力を求められるので2回入力します。
→private.key が生成されます。

2.CSRの作成
作成した秘密鍵からCSRを生成します。
# ./openssl  req  -new  -key  private.key  -out  server.csr
秘密鍵のパスフレーズの入力を求められるので入力します。
証明書に記載する詳細情報(ディスティングイッシュネーム)を入力します。
  • Common Name: コモンネーム(SSL接続の際のURL)
  • Organization Name: 組織名
  • Organization Unit: 部門名
  • Locality: 市区町村名
  • State: 都道府県
  • Country: 国識別番号(JP固定)
→server.csr が生成されます。

3.秘密鍵にパスフレーズを埋め込む(オプション - 必須じゃない)
これをすると Apache 起動時にパスフレーズを入力する必要がなくなります。
# ./openssl  rsa  -in  private.key  -out  private_with_pass.key
パスフレーズの入力を求められるので入力します。
→private_with_pass.key が生成されます。


認証機関にcsrを送付
詳しい手順は省きます。
シマンテック(旧:VeriSign)などの認証機関にcsrを送付して、認証局(CA)の承認をもらいます。
承認が終わると電子証明書(server.crt)が取得できます。
一般的には1年間の期限で更新することが多いです。

自前で行う場合は以下のようにします。

1.電子証明書の作成(自前で実施)
本来なら認証局の秘密鍵で署名するのですが、自前なので持っている秘密鍵で署名します。
# ./openssl  x509  -in  server.csr  -sha256  -days  365  -req  signkey  server.key  -o server.crt
→server.crt が生成されます。

電子証明書(server.crt)には公開鍵情報とCA局の署名が含まれています。

1.電子証明書(server.crt)から鍵情報を見る
# ./openssl  x509  -noout  -text  -in  server.crt
Not Before: 証明書が発行された日時
Not After: 証明書の有効期限


秘密鍵と電子証明書をWebサーバに設定します。

Webサーバへの設定(Apache)
Apacheの443番ポートでhttpsをする設定です。

1./etc/httpd/conf/httpd.conf
<VirtualHost  *:443>
SSLEngine  on
SSLCertificateFile  /etc/httpd/conf/server.crt
SSLCertificateKeyFile  /etc/httpd/conf/server.key
・・・
(以下httpの設定と同様)
・・・
</VirtualHost>
※もちろん、httpd.conf から include される conf ファイルならどこでも良い。


(2016.9.14 追記)
秘密鍵の生成方法で以下の質問がありました。

疑似乱数を使用する方法
openssl md5 * > rand.dat
openssl genrsa -rand rand.dat -des3 2048 > newkey.pem

randオプションを使用しない方法
openssl genrsa -des3 -out ./ssl.key/xxxxxxx.key 2048

どのような違いがあるのでしょうか。
乱数があった方がセキュリテイ度が高いのでしょうか。

回答
* なのですが、これがファイルを指定しているのは分かりますでしょうか?
つまりカレントディレクトリのファイル全部を指定していて、そのハッシュ値を出しています。適当に選んだファイルをハッシュ値にしているのだから乱数だよねって言い分です。
つまり、どちらの2種類の乱数をとっても、どっちみち乱数ですね。

ここまではいいです。

1年後に再度更新作業をするとします。
opensslのbinディレクトリって更新すると思いますか?
しないですよね。。。
まったく同じファイルを引数にしたら、まったく同じハッシュ値が取得できます。
つまり、疑似乱数を使用する方法では、来年まったく同じ秘密鍵が生成されます。

この点で、疑似乱数を使用する方法は脆弱であり、セキュリティは低いです。

もしbinディレクトリにrand.datファイルを置いた場合、1年後はいいかもしれないけど2年後以降はやっぱり同じ事象が発生しちゃいますね。
そんなに長い間使うかどうかは分からないよっていう言い分が聞こえるかもしれないですね。。。
そうだとしたら、(つまり上の主張をのぞけば、)2つは同じ強度といっても良いと思います。

知恵袋URL
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14164256229
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13164133598

0 件のコメント:

コメントを投稿