2015年10月14日水曜日

Keystore と秘密鍵と公開鍵の関係について

Java では、Keytool という鍵と証明書を管理するためのユーティリティを利用して、SSL やTLS などの暗号化通信を実現します。

SSL/TLS 通信は、以下のステップで実現されます。(Server Hello Done までを記載)

Client Hello
Server Hello
Server Certificate
Server Hello Done
Client Hello で、どの暗号化スイートを利用して通信したいかを問い合わせます。


Server Hello で、暗号化スイートを決定し、Server Certificate でサーバ証明書を渡します。



このサーバ証明書を作成するために、Keytool を使います。

サーバ証明書は、認証局の署名が必要です。 企業は正規の業者から署名をしてもらいますが、テスト時やインターナルな環境では、必ずしも正規の業者からの署名は必要ないかもしれません。

そのような場合、通称「オレオレ認証局」という、自作認証局を作成して、サーバ証明書に署名をすることになります。

オレオレ認証局の作成の仕方は他のサイトを見て頂くことにしますが、大きく2通りのやり方が公開されています。 1つは、OpenSSL とPerl を利用して認証局を構築するやり方。
もう1つは、OpenSSL のみで構築するやり方。

どちらでも構築はできますので、調べてみてください。
で、Keytool を利用し、Keystore を生成する場合、以下の2種類のエントリが存在します。
PrivateKeyEntry
TrustedCertEntry
暗号化通信をする場合に必要となるエントリは、PrivateKeyEntry になります。 これは、公開鍵と秘密鍵のペアのエントリになります。

以下では、Keystore ファイルの生成方法の概要を記載します。
サーバ管理者が秘密鍵を生成
サーバ管理者が秘密鍵から証明書署名要求ファイルを生成
オレオレ認証局は自分の秘密鍵で証明書署名要求ファイルに署名してサーバ証明書を生成
サーバ管理者はサーバ証明書とサーバ管理者側の秘密鍵を利用して、公開鍵と秘密鍵のペアファイルを生成
生成するKeystore ファイルにペアファイルをインポート

具体的なコマンドは以下の通り。
openssl genrsa -des3 -out private.key
openssl req -new -days 3650 -key private.key -out server.csr
openssl req -keyout ca/cakey.pem -out ca/cacert.pem -new -x509
openssl ca -in server.csr -keyfile ca\cakey.pem -cert ca\cacert.pem –out server.crt
openssl pkcs12 -inkey private.key -in server.crt -export -out pair.pkcs12
keytool -importkeystore -srckeystore pair.pkcs12 -srcstoretype PKCS12 -destkeystore keystore
※下記の修正は事前にしておくこと。
修正1:openssl.cnf を開いて、ca のディレクトリを指定する。(実行フォルダにca フォルダを新規で作成しておく)
[ CA_default ]
dir  = ./ca  # Where everything is kept
修正2:空のindex.txt ファイルを./ca に配置しておく。
修正3:4桁以上の数字が記入されたserial というファイル名(拡張子無し)のファイルを./ca に配置しておく。