OpenSSL メモ
OpenSSLとは
OpenSSL は Eric A. Young と Tim J. Hudson によって開発された暗号ライブラリ SSLeay を元に現在最もWeb上で普及しているセキュアなProtocolであるSSLv2/3,TLS1を実装したアプリケーションです。これひとつで、SSLサーバ/クライアントはもとより証明書の発行、管理(ちょっと面倒)、認証まで行えてしまいます。同様の機能(≠SSLeay)をもつ国産のソフトとしてはAiCAがあります。
OpenSSLの入手先
最新のOpenSSLバイナリは http://www.openssl.org/ より入手できます。Windows上で運用する場合は、精力的にWin32バイナリを配布しておられる(ありがたや) Shining Light Productions より入手してください。Win32バイナリの場合はインストーラがついてきます。インストールが完了したら、コマンドプロンプトより、
C:\>openssl version
と打って、正しくインストールされているかどうか確かめてみてください。
とりあえずSSLサーバしてみる
無事インストールとPATHの疎通確認が終わったら、とりあえずSSLサーバを起動してみましょう。コマンドプロンプトより、
C:\>openssl
と打って、プロンプトが OpenSSL> に変わればOKです。OpenSSL> に続けて
s_server -www -accept 5443 -cert C:\openssl\bin\PEM\demoCA\cacert.pem -key C:\openssl\bin\PEM\demoCA\privatecakey.pem
と入力してエンターキーを押下してください。ここでは便宜上C:\直下にopensslがインストールされている設定ですが、Windows7以降ではユーザフォルダ直下、MacOSでは which openssl などとしてインストール先のディレクトリに適宜読み替えて下さい。
(略)
Using default temp DH parameters
ACCEPT
と表示されればOKです。お手持ちのブラウザから、https://localhost:5443 にアクセスしてみてください。 今回はOpenSSLに付属してるデモ用の証明書と秘密鍵を利用しましたので、各種認証エラーでまくりだと思われますが、とりあえずのSSLサーバとして動作する事はご確認いただけたと思います。
s_server
先ほどの動作確認の際に打ち込んだコマンドです。指定されたポートで稼動するSSL/TLSサーバ(それとSimpleなHTTP応答機能)を実現します。OpenSSLはそれ自身を起動したのち、OpenSSL> プロンプトで、さまざななコマンドに無数のオプションとそれに伴う引数を指定のうえ、タスクを実現します。各種コマンド,オプション,引数に関しての正確な情報は OpenSSLのドキュメント を参照してださい。
以下にs_serverコマンドでよく利用する、いくつかのオプションを挙げておきます。
-accept port
待ち受けるTCPポート番号を指定します。このオプションが省略された場合は4433が利用されます。
-cert certname
設定するサーバでチェインの末端に位置する証明書(一般的にはそのサーバ自身を証明するもの)を指定します。Apache-SSLでいう、SSLCertificateFile ディテクティブに相当します。このオプションを省略した場合は"server.pem"が指定された、とみなされます。
-key keyfile
先ほどの -cert で指定したサーバ証明書の秘密鍵を指定します。Apache-SSLでいう、SSLCertificateKeyFile ディテクティブに相当します。
-verify depth, -Verify depth
Client認証時に辿るチェインの深さを指定します。Apache-SSLでいう、SSLVerifyDepth ディテクティブに相当しますが、OpenSSL単体の場合は SSLVerifyClient も同時に指定します。-verify とすると任意。-Verify とするとクライアント証明書の送付が必須となります。
-CAfile file
"-cert" で指定したサーバ証明書までの認証パスを持つ証明書チェインを、pemエンコードされた単一のファイルで指定します。Apache-SSLでいう、SSLCACertificateFile ディテクティブに相当。ちなみに先頭2文字は大文字でないとinvalid commandとなります。OpenSSLコマンドは大文字と小文字を区別するようです
-state
クライアントから接続があった際に、進行中のハンドシェイクの流れをおおまかに表示します。
-debug
レコードレイヤまで含めた広範なトラフィック情報を16進ダンプを含めて表示します。
-msg
プロトコルレイヤの情報を16進ダンプと一緒に表示します。
※古い版のOpenSSLには搭載されていません。
-ssl2, -ssl3, -tls1, -no_ssl2, -no_ssl3, -no_tls1
前者3つはServerHello送信時のサーバ側SSLバージョンを指定し、後者3つはそのサーバで無効とするSSLバージョンを指定します。
-cipher cipherlist
ServerHello送信時にサーバが指定するCipherのリストを指定します。
参照:http://www.openssl.org/docs/apps/ciphers.html#
ページ下部にあるCipherSuiteを単体で指定する事も可能で、clientがそれをサポートしてない場合はハンドシェイク失敗となります。