Secure Sockets Layer (SSL) トランスポート層セキュリティーを使用することにより、Java™ API for RESTful Web Services (JAX-RS) アプリケーションと、そのアプリケーションを呼び出すクライアントの間の通信を保護することができます。
このタスクについて
JAX-RS クライアント・プログラムは、
JAX-RS リソースからの要求および応答を保護するために、Secure Socket Layer (SSL) を使用する
トランスポート・セキュリティーを利用することができます。
REST リソース開始時にトランスポート・レベル・セキュリティーに SSL チャネルを
使用するよう JAX-RS アプリケーションを構成した場合、
JAX-RS クライアントは、
WebSphere® Application Server 環境に
デプロイされた JAX-RS リソースと対話できるように、SSL 接続を使用する必要があります。例えば、JAX-RS アプリケーション
が基本認証を使用するよう構成されている場合、
保護された接続を介してユーザー・クレデンシャルが転送されるように SSL を使用するのが一般的な方法です。
このシナリオの例を示すために、セル内にアプリケーション・サーバーが 1 つ存在し、そのサーバー上に JAX-RS リソースがデプロイされているとします。
このサーバー上のこれらの JAX-RS リソースは、SSL を使用する必要があります。Thin Client for JAX-RS、
(この製品と共に提供される Java ベースのスタンドアロン・クライアント) を使用して、
SSL の使用を必要とするこれらの保護されたリソースの 1 つを呼び出すと想定します。Thin Client
for JAX-RS を使用すると、管理対象外の JAX-RS RESTful Web サービス・クライアント・アプリケーション
を WebSphere 以外の環境で実行して、アプリケーション・サーバーでホストされている JAX-RS RESTful Web サービスを
呼び出すことができます。
図 1. SSL を使用した JAX-RS シン・クライアントの保護
重要: ダウンストリーム呼び出しを行う場合など、WebSphere Application Server 環境で実行しているアプリケーションから JAX-RS リソースを呼び出す場合、SSL に関する追加構成は必要ありません。アプリケーション・サーバーの SSL ランタイムおよび構成が使用されるため、このリソースに対して SSL 接続を構成する必要はありません。
Thin Client for JAX-RS で SSL を
構成するには、以下のステップを実行します。
- JAX-RS アプリケーションに対してセキュリティーを有効にし、REST リソースを呼び出す際にトランスポートに SSL チャネルを使用するようにアプリケーションを構成します。
アプリケーションを開発またはデプロイするときに、web.xml ファイルを編集し、リソースに対して SSL の使用を必須とするセキュリティー制約を追加します。アプリケーションに対して SSL を有効にする方法について詳しくは、『Web コンテナー内での JAX-RS アプリケーションの保護』を参照してください。
security-constraint エレメント内の以下のエレメントは、アプリケーションに対して SSL を強制するように指定します。
<user-data-constraint id="UserDataConstraint_1">
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
- ssl.client.props ファイルを編集して、鍵ストアおよびトラストストアのプロパティーを定義します。
ssl.client.props ファイルは、クライアントに対して SSL を構成するのに
使用されます。以下のコード例は、
鍵ストアおよびトラストストアのプロパティーの定義を示しています。
# keystore information
com.ibm.ssl.keystoreName=ClientDefaultKeyStore
com.ibm.ssl.keyStore= path/to/keystore/file
com.ibm.ssl.keyStorePassword=xxxxxxx
com.ibm.ssl.keyStoreType=PKCS12
com.ibm.ssl.keyStoreProvider=IBMJCE
com.ibm.ssl.keyStoreFileBased=true
# truststore information
com.ibm.ssl.trustStoreName=ClientDefaultTrustStore
com.ibm.ssl.trustStore=path/to/truststore/file
com.ibm.ssl.trustStorePassword=xxxxxx
com.ibm.ssl.trustStoreType=PKCS12
com.ibm.ssl.trustStoreProvider=IBMJCE
com.ibm.ssl.trustStoreFileBased=truecom.ibm.ssl.trustStoreReadOnly=false
- ホスト名の検証を使用可能または使用不可にします。
com.ibm.ssl.performURLHostNameVerification プロパティー
の値が true に設定されている場合、URL ホスト名の検証が実行されます。
ターゲット・サーバーに対して HTTP URL 接続が行われた場合、サーバー証明書の共通名 (CN) がターゲット・ホスト名と一致している必要があります。
一致していない場合は、ホスト名のベリファイヤーが接続を拒否します。
デフォルト値の false は、この検査を省略します。
com.ibm.ssl.validationEnabled プロパティー
の値が true に設定されている場合、各 SSL 構成はロードされるたびに
検証されます。デフォルト値の false は、この検査を省略します。
com.ibm.ssl.performURLHostNameVerification=false
com.ibm.ssl.validationEnabled=false
- サーバー証明書の署名者がクライアント・トラストストア内にあることを確認します。
IBM® iKeyman ツールまたは Java keytool ユーティリティーを使用して、
証明書が既にトラストストア内にあるかどうかを判別します。証明書がトラストストア内にない場合、
証明書をトラストストアにインポートしてください。
例えば、トラストストア trust.p12 内に含まれている証明書を
リストするには、以下のコマンドを入力し、トラストストアへの絶対パスを含め
ていることを確認します。
keytool -list -v -storetype pkcs12 -keystore trust.p12
- 証明書をインポートします。
サーバー証明書の署名者がクライアント・トラストストアにない場合、またはクライアント・トラストストアにない
自己署名証明書をサーバーが持っている場合、証明書をインポートします。
証明書をインポートするには、IBM iKeyman または Java keytool ユーティリティーのいずれか好みのツールを使用できます。
次の例では、Java keytool ユーティリティー
を使用しています。
- サーバー用の署名者証明書をファイルにエクスポートします。
例えば、署名者証明書を、別名 default_signer に対応するエントリー内の既存のトラストストア servertrust.p12 からファイル mycert.cer にエクスポートするには、以下のコマンドを使用します。
keytool -export -storetype pkcs12 -alias default_signer -file mycert.cer -keystore servertrust.p12
- 署名者証明書を、Thin Client for JAX-RS で使用されるトラストストアにインポートします。
例えば、以下のコマンドを使用して、
既存のトラストストア servertrust.p12 の default_signer 別名に対応するエントリーから、署名者証明書を
ファイル mycert.cer にエクスポートします。
keytool -export -storetype pkcs12 -alias default_signer -file mycert.cer -keystore servertrust.p12
- Thin Client for JAX-RS 2.0 で SSL を構成します。
暗号化された URL を呼び出すには、以下のステップを実行します。
- シン・クライアント・アプリケーションを開発する際にクライアント SSL を使用可能にするには、シン・クライアント・アプリケーション・コードにクライアント・プロパティーを追加します。
クライアント・プロパティー・キーを com.ibm.ws.jaxrs.client.ssl.config に設定し、
その値をサーバーの SSL 別名にします。以下のコード・スニペットを参照してください。
ClientBuilder cb = ClientBuilder.newBuilder();
cb.property("com.ibm.ws.jaxrs.client.ssl.config", "NodeDefaultSSLSettings");
ヒント: プロパティー値は、設定したサーバー SSL 別名と同じです。詳しくは、
「アプリケーション・サーバー」->「サーバー n」
(n はアプリケーション・サーバーに割り当てた番号) ->「Web コンテナー・トランスポート・チェーン」->「WCInboundDefaultSecure」->「SSL インバウンド・チャネル (SSL_2)」と進み、SSL 構成フィールドの下のサーバー SSL 別名を確認してください。
- 暗号化された URL を呼び出すには、コマンド行から以下のコード例を実行します。
![[HP-UX]](../images/hpux.gif)
![[Linux]](../images/linux.gif)
![[Solaris]](../images/solaris.gif)
java -Dcom.ibm.SSL.ConfigURL=file:///$WAS_HOME/AppServer/profiles/AppSrv01/properties/ssl.client.props -cp .:$WAS_HOME/AppServer/runtimes/com.ibm.jaxrs2.0.thinclient_$VERSION.jar:$WAS_HOME/AppServer/runtimes/com.ibm.jaxws.thinclient_$VERSION.jar:$WAS_HOME/AppServer/com.ibm.ws.admin.client_$VERSION.jar:$WAS_HOME/AppServer/plugins/com.ibm.ws.security.crypto.jar your_package.SSLThinClientProgram <An encrypted URL>
![[Windows]](../images/windows.gif)
java -Dcom.ibm.SSL.ConfigURL=file:///$WAS_HOME/AppServer/profiles/AppSrv01/properties/ssl.client.props -cp .;$WAS_HOME/AppServer/runtimes/com.ibm.jaxrs2.0.thinclient_$VERSION.jar;$WAS_HOME/AppServer/runtimes/com.ibm.jaxws.thinclient_$VERSION.jar your_package.SSLThinClientProgram <An encrypted URL>