SSL をサポートする Java CAPS の構成

SSL の概要

SSL (Secure Sockets Layer) プロトコルを使用すれば、インターネットを介したクライアントとサーバー間の通信を保護できます。

SSL には、サーバー認証、クライアント認証、データ暗号化などの機能があります。「認証」とは、サーバーまたはクライアントの正当性を確認することです。「暗号化」とは、送信する前にデータを読み取れない形式に変換することです。

SSL を使用する URL のスキーマは、https です。次に例を示します。


https://www.onlinebooks.com/creditcardinfo.html

SSL の最新バージョンは TLS (Transport Layer Security) と呼ばれており、IETF (Internet Engineering Task Force) が TLS の規格を管理しています。

公開鍵、非公開鍵、および証明書

認証の実行時、SSL では「公開鍵暗号方式」と呼ばれる技術を使用します。

公開鍵暗号方式は、「公開鍵」と「非公開鍵」から成るキーペアの概念に基づいています。公開鍵を使用して暗号化されたデータは、対応する非公開鍵でのみ復号化できます。反対に、非公開鍵を使用して暗号化されたデータは、対応する公開鍵でのみ復号化できます。

図に、公開鍵を使用した単語の暗号化と、非公開鍵を使用した単語の復号化を示します。

キーペアの所有者は、公開鍵はだれにでも使用可能にし、非公開鍵は秘密にしておきます。

「証明書」により、エンティティーが特定の公開鍵の所有者であることが検証されます。

X.509 標準に準拠する証明書には、データセクションと署名セクションがあります。データセクションに含まれる情報は、次のとおりです。

証明書は、VeriSign などの認証局 (CA) から取得できます。また、所有者と発行者が同じである「自己署名付き証明書」を作成することもできます。

証明書を発行する組織は、CA の階層を確立できます。ルート CA は、自己署名付き証明書を保持します。各従属 CA は、階層内で一つ上位の CA によって署名された証明書を持ちます。「証明書チェーン」とは、特定の CA の証明書に、ルート CA にまでつながるそれより上位の CA の証明書をすべて加えたものです。

keytool プログラム

keytool プログラムは、JavaTM SDK の bin ディレクトリに含まれるセキュリティーツールです。

このツールは、「キーストア」と呼ばれる一種のデータベースを管理します。キーストアには、次の 2 つのタイプのエントリが格納されます。

キーストア内の各エントリは、一意の「エイリアス」によって識別されます。キーストアにエンティティーを追加する場合は、必ずエイリアスを指定してください。

keytool プログラムで使用できるコマンドには、次のものが含まれます。

keytool プログラムの詳細については、http://java.sun.com/j2se/1.5.0/docs/tooldocs/index.html を参照してください。

OpenSSL プロジェクト

OpenSSL プロジェクトは、暗号化ライブラリだけでなく、SSL および TLS プロトコルも実装するオープンソースのツールキットを開発するプロジェクトです。

このツールキットに含まれる openssl コマンド行ツールにより、暗号化ライブラリのさまざまな関数が利用可能になります。

openssl ツールで使用できるコマンドには、次のものが含まれます。

最新バージョンの OpenSSL は、http://www.openssl.org からダウンロードできます。

SSL とアダプタ

HTTP、LDAP、および WebSphere MQ で SSL を使用すると、ハッカーやその他のエンティティーによる不正な傍受から、データ交換をセキュリティー保護できます。アダプタの SSL 機能により、データ交換のためのセキュリティー保護された通信チャネルが提供されます。

次の図に、LDAP アダプタでの SSL の使用を示します。

図は、SSL がどのようにしてハッカーが行う man-in-the-middle 攻撃を防ぐかを示しています。

この SSL 機能は、Java Secure Socket Extension (JSSE) version 1.0.3 の使用を介してサポートされます。

現在は、JSSE のリファレンス実装が使用されています。JSSE はプロバイダベースのアーキテクチャで、これにより、暗号化アルゴリズム、ハッシュアルゴリズム、SSL 対応 URL ストリームハンドラ、その他の標準インタフェースのセットが提供されます。

ユーザーはこれらのインタフェースを介して JSSE と対話するので、公開されたインタフェースの下で実装がプログラムされているかぎり、さまざまなコンポーネントを混在させて組み合わることができます。ただし、一部の実装は、特定のアルゴリズムをサポートしない可能性があります。

JSSE 1.0.3 API は、SSL version 2.0 と 3.0、および TLS version 1.0 をサポートします。これらのセキュリティープロトコルにより、通常の双方向ストリームソケットがカプセル化されます。JSSE 1.0.3 API により、認証、暗号化、および完全性の保護の透過的サポートも提供されます。JSSE のリファレンス実装では、SSL version 3.0 と TLS version 1.0 が実装されます。

Web サーバーとの SSL 接続の設定に使用できるオプションは、次のとおりです。

キーストアとトラストストア

JSSE では、「キーストア」および「トラストストア」と呼ばれるファイルを使用します。キーストアは、アダプタでクライアント認証に使用され、トラストストアは、SSL 認証でサーバーを認証する際に使用されます。

キーストアとトラストストアは両方とも、Java SDK インストールに含まれている keytool という名前のユーティリティーによって管理されます。

キーストアとトラストストアの生成

次の節では、キーストアとトラストストアの両方を作成する方法について説明します。または、次の場所にあるデフォルトの論理ホストのトラストストアのような既存のトラストストアに証明書をインポートしてもかまいません。


<c:\JavaCAPS>\appserver\domains\<MyDomain>\config\cacerts.jks

<c:\JavaCAPS> は Java CAPS がインストールされるディレクトリ、<MyDomain> はお使いのドメイン名です。主に使用するツールは keytool ですが、opensslpkcs12 キーストアを生成するためのリファレンスとして使用します。

openssl と利用可能なダウンロードの詳細については、次の Web サイトを参照してください。

http://www.openssl.org

JKS 形式のキーストアの作成

この節では、非公開鍵、および関連する証明書または証明書チェーンの両方のデータベース形式に JKS 形式を使用してキーストアを作成する方法について説明します。keytool はデフォルトでは、java.security ファイルに指定されているように、キーおよび証明書のデータベース (キーストアおよびトラストストア) の形式として JKS を使用します。CA は、証明書署名要求 (CSR) に署名する必要があります。これによりその CA は、アダプタの接続先であるサーバー側アプリケーションによって信頼されます。


注 –

次のデフォルトのキーストアを使用することをお勧めします。


<c:\JavaCAPS>\appserver\domains\<MyDomain>\config\keystore.jks

<c:\JavaCAPS> は Java CAPS がインストールされるディレクトリ、<MyDomain> はお使いのドメイン名です。


Procedureキーストアを生成する

  1. 次のコマンドを実行します。


    keytool -keystore clientkeystore -genkey -alias client
  2. 要求に従って、CSR の生成に必要な情報を入力します。次に、キーの生成セクションの例を示します。


    Enter keystore password: javacaps
    What is your first and last name?
    [Unknown]: development.sun.com
    What is the name of your organizational unit?
    [Unknown]: Development
    what is the name of your organization?
    [Unknown]: Sun
    What is the name of your City or Locality?
    [Unknown]: Monrovia
    What is the name of your State or Province?
    [Unknown]: California
    What is the two-letter country code for this unit?
    [Unknown]: US
    Is<CN=development.sun.com, OU=Development, O=Sun, L=Monrovia, ST=California, 
    C=US> correct?
    [no]: yes
    
    Enter key password for <client>
        (RETURN if same as keystore password):

    キーストアパスワードが指定されている場合は、アダプタにそのパスワードを指定します。

  3. キーパスワードの入力を要求されたら、RETURN キーを押します。これで、キーパスワードがキーストアパスワードと同じになります。

    この操作で、キーストアファイル clientkeystore が現在の作業ディレクトリに作成されます。「氏名 (名前と名字)」の質問には、完全修飾ドメインを指定する必要があります。このようにする理由は、VeriSign など一部の CA が、このプロパティーを完全修飾ドメイン名と見なすからです。

    完全修飾ドメインを要求しない CA もありますが、可搬性を考慮して、完全修飾ドメイン名を使用することをお勧めします。そのほか、入力するすべての情報は有効でなければなりません。それらの情報を確認できないかぎり、VeriSign などの CA は、このエントリで生成される CSR に署名しません。

    このキーストアには、クライアントのエイリアスを持つエントリが格納されます。次に示すように、このエントリは、生成された非公開鍵と CSR の生成に必要とされる情報から成ります。


    keytool -keystore clientkeystore -certreq -alias client -keyalg rsa -file client.csr

    このコマンドで、証明書要求用に CA に提出できる証明書署名要求を生成します。client.csr ファイルには、PEM 形式で CSR が格納されます。

    いずれかの CA (アダプタの接続先となる Web サーバーが信頼する CA) が、CSR に署名する必要があります。その CA は、対応する CSR の証明書を生成し、自身の非公開鍵で証明書に署名します。詳細については、次の Web サイトを参照してください。

    http://www.thawte.com

    または

    http://www.verisign.com

    その証明書が CA の証明書とチェーンになっている場合は次の手順の手順 4 を実行し、そうでない場合は手順 5 を実行します。

  4. 次のコマンドを実行します。


    keytool -import -keystore clientkeystore -file client.cer -alias client

    このコマンドで証明書をインポートし、クライアント証明書が client.cer ファイルに、CA の証明書が CARoot.cer ファイルにあると想定します。

  5. 次のコマンドを実行して、CA の証明書をキーストアにインポートし、クライアントの証明書とチェーンにします。


    keytool -import -keystore clientkeystore -file CARoot.cer -alias theCARoot
  6. 次のコマンドを実行して、前の手順で証明書をインポートした CA によって署名されたクライアントの証明書をインポートします。


    keytool -import -keystore clientkeystore -file client.cer -alias client

    生成される clientkeystore ファイルには、クライアントの非公開鍵と、それに関連する証明書チェーンが格納され、クライアントの認証および署名に使用されます。これで、キーストア、clientkeystore の両方またはいずれかを、アダプタのキーストアとして使用できます。

PKCS12 形式のキーストアの作成

この節では、JSSE で使用できる PKCS12 キーストアの作成方法について説明します。実際の稼動環境では、顧客が既存の非公開鍵と証明書 (既知の CA によって署名済み) をすでに保持している場合があります。その場合、ユーザーは keytool を使用しての非公開鍵のインポート、エクスポートいずれもできないため、JKS 形式は使用できません。非公開鍵とその証明書から成る PKCS12 データベースの生成が必要です。

生成された PKCS12 データベースは、アダプタのキーストアとして使用できます。現在、keytool ユーティリティーには、PKCS12 データベースへの書き込み機能はありませんが、PKCS12 データベースから読み取ることはできます。


注 –

PKCS12 証明書を生成できる他社製のツールを代わりに使用することもできます。


次の例では、openssl を使用して PKCS12 キーストアを生成しています。


cat mykey.pem.txt mycertificate.pem.txt>mykeycertificate.pem.txt

既存のキーは、mykey.pem.txt ファイルに PEM 形式で格納されています。証明書は mycertificate.pem.txt にあり、これも PEM 形式です。キーおよびそのあとに続く証明書を含むテキストファイルを次のように作成します。


openssl pkcs12 -export -in mykeycertificate.pem.txt -out mykeystore.pkcs12 
-name myAlias -noiter -nomaciter

このコマンドは、ユーザーにパスワードの入力を要求します。パスワードは必須です。パスワードがないと、キーストアは JSSE で動作しません。このパスワードは、アダプタのキーストアパスワード用のパスワードとしても指定します。

このコマンドでは、openssl pkcs12 コマンドを使用して、非公開鍵と証明書を持つ PKCS12 キーストアも生成します。生成されるキーストアは mykeystore.pkcs12 で、myAlias エイリアスで指定されたエントリが格納されます。このエントリには、-in 引数で指定した非公開鍵と証明書が含まれます。noiter オプションと nomaciter オプションを指定して、生成されるキーストアが JSSE によって正しく認識されるようにします。

トラストストアの作成

ここでは、信頼できる firstCA.cert、secondCA.cert、thirdCA.cert という CA が C:\cascerts ディレクトリに存在すると仮定して説明します。これら 3つの信頼できる証明書から成る新しいトラストストアを作成できます。

Procedure新規トラストストアを作成する

  1. 次のコマンドを実行します。


    keytool -import -file C:\cascerts\firstCA.cert -alias firstCA -keystore myTrustStore
  2. このコマンドをあと 2 回入力しますが、firstCA の箇所を 2 回目は secondCA で、3 回目は thirdCA で置き換えます。これらの各コマンドエントリには、次の目的があります。

    • 最初のエントリで、myTrustStore という名前のキーストアファイルを現在の作業ディレクトリに作成し、firstCA 証明書を firstCA というエイリアスでトラストストアにインポートします。myTrustStore の形式は JKS です。

    • 2 回目のエントリでは、secondCA を代わりに使用して、secondCA 証明書をトラストストア myTrustStore にインポートします。

    • 3 回目の入力では、thirdCA を代わりに使用して、thirdCA 証明書をトラストストアにインポートします。

    これらを完了すると、myTrustStore をアダプタのトラストストアとして使用できます。