原文はこちら。
https://blogs.oracle.com/ateamsoab2b/entry/2_ways_ssl_between_soa
SOAコンポジットと外部パートナーリンクとの間で双方向のSSLを使う必要がある場合、以下の手順で実現することができます。
- 資格証明ストアを作成、キーストアとサーバ証明書を信頼する
- WebLogic Server上でキーストアとSSLを構成する
- 双方向SSLを使うよう、サーバを構成する
- 双方向SSLを使うよう、SOAコンポジットのパートナーリンクを構成する
- SOAエンジンで双方向SSLを使うよう構成する
今回は、テストのためにSOAとOSBを使います。OSBとSOAの別のドメインではじめました。2個のSOAPベースのプロキシサービスをOSBにデプロイし、SOAに2個のコンポジットをデプロイしました。SOAでは、1個のコンポジットがOSBのプロキシサービスを呼び、別のコンポジットがOSBから呼び出されます。同様に、OSBでは、1個のプロキシサービスがSOAコンポジットを呼び出し、他方がSOAから呼び出されます。
1.資格証明ストアを作成し、キーストアとサーバ証明書を信頼する
これは開発環境なので、JDKのkeytoolを使ってストアと自己署名証明書(別名オレオレ証明書)を作成していますが、本番環境ではVerisignのような信頼された認証局から発行された証明書を使うべきです。以下のスクリプトを作成して、この手順で必要なものをご説明しましょう。唯一の要件は、エイリアスとしてmykeyを使う必要がある、ということです。
STOREPASS=welcome1
KEYPASS=welcome1
# generate identity keystore for soa and osb. Note: For SOA, you MUST use alias mykey
echo "creating stores"
keytool -genkey -alias mykey -keyalg "RSA" -sigalg "SHA1withRSA" -dname "CN=soa, C=US" -keystore soa-default-keystore.jks -storepass $STOREPASS -keypass $KEYPASS
keytool -genkey -alias osbkey -keyalg "RSA" -sigalg "SHA1withRSA" -dname "CN=osb, C=US" -keystore osb-default-keystore.jks -storepass $STOREPASS -keypass $KEYPASS
# listing keystore contents
echo "listing stores contents"
keytool -list -alias mykey -keystore soa-default-keystore.jks -storepass $STOREPASS
keytool -list -alias osbkey -keystore osb-default-keystore.jks -storepass $STOREPASS
# exporting certs from stores
echo "export certs from stores"
keytool -exportcert -alias mykey -keystore soa-default-keystore.jks -storepass $STOREPASS -file soacert.der
keytool -exportcert -alias osbkey -keystore osb-default-keystore.jks -storepass $STOREPASS -file osbcert.der
# import certs to trust stores
echo "import certs"
keytool -importcert -alias osbkey -keystore soa-trust-keystore.jks -storepass $STOREPASS -file osbcert.der -keypass $KEYPASS
keytool -importcert -alias mykey -keystore osb-trust-keystore.jks -storepass $STOREPASS -file soacert.der -keypass $KEYPASS
SOA Suiteはアウトバウンドのトラフィックのために、WebLogic ServerのSSL実装ではなく、JDKのSSL実装を使っています。パートナーの公開証明書をインポートしてSOAが利用する信頼されたキーストアに取り込みます。SOAがデフォルトで利用する信頼されたキーストアはDemoTrust.jksで、これは$MW_HOME/wlserver_10.3/server/libにあります(これは起動スクリプトの -Djavax.net.ssl.trustStore で設定されています)。ご自身の信頼されたキーストアをお持ちの場合、ご自身の信頼されたキーストアに証明書をインポートする必要があります。
keytool -importcert -alias osbkey -keystore $MW_HOME/wlserver_10.3/server/lib/DemoTrust.jks -storepass DemoTrustKeyStorePassPhrase -file osbcert.der -keypass $KEYPASS
この手順を踏まない場合、SOAがOSBのサービスを双方向SSLを使って呼び出した際に以下の実行時例外が発生します。
Message send failed: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
2.WebLogic ServerでキーストアとSSLを構成する
まず、WebLogic Server管理コンソールにログインし、サーバ>構成>キーストアのタブへ移動します。キーストアの種類を「カスタムIDとカスタム信頼」に変更し、残りのフィールドを入力します。
SSLタブへ移動し、IDの項目で詳細設定をクリックします。自己署名証明書を今回VM環境で利用しているため、ホスト名の検証は無効にしました。実際の運用環境のシステムでは、ホスト名検証を実施すべきです。また、「サーバーの証明書を使用」をONにして、アプリケーションがサーバ証明書を使ってHTTPトラフィックを初期化できるようにしました(OSBでこれを有効化することが重要です)。
最後に、「SSLリスニング・ポートの有効化」を[サーバ]>[構成]>[全般]でONにします。
3. 双方向SSLを使うようサーバを構成する
先ほどの手順のスクリーンショットに従うと、[サーバ]>[構成]>[SSL]>[詳細設定]に「相互クライアント証明書の動作」というオプションがあることにお気づきかと思います。これを「クライアント証明書をリクエスト(強制する)」に設定する必要があります。
2と3手順をOSBについても繰り返します。これらの設定が全て終了したら、全サーバを再起動します。
4.SOAコンポジットのパートナーリンクを双方向SSLを使うように構成する
プロジェクトのcomposite.xmlを編集して設定します。パートナーリンクの参照の部分にoracle.soa.two.way.ssl.enabledというプロパティを追加します。
WSDLDriven
true
OSBでは、プロキシサービスのトランスポート構成で「HTTSが必要」というフラグにチェックします。構成後、composite.jarファイルをリビルドして、Enterprise Manager Fusion Middleware Controlでのデプロイの準備が整いました。
5.SOAエンジンの双方向SSLを構成する
Oracle SOA Suiteは、Oracle WebLogic Serverの実装とSun Secure Socket Layer(SSL)スタックの両方を使って双方向SSLを構成します。
- インバウンドのWebサービスバインディング用に、Oracle SOA SuiteはOracle WebLogic Serverインフラストラクチャを使うため、SSL用のOracle WebLogic Serverのライブラリを使います。これは既に前の章の手順2と3で実施済みです。
- アウトバウンドのWebサービスバインディング用に、Oracle SOA SuiteはJRF HTTPClientを使います。そのため、SSL用にSun JDKのライブラリを使用します。これは、Enterprise Manager Fusion Middleware Controlで[soa-infra]を右クリックし、[SOA管理]>[共通プロパティ]を選択してSOAエンジンを設定していきます。
ページの最下部のリンク[詳細SOAインフラ拡張構成プロパティ]をクリックし、[KeystoreLocation]のフィールドにSOAアイデンティティキーストアの完全パスを入力します。
「適用」をクリックし、[ドメイン]>[セキュリティ]>[資格証明]へ移動します。
ここでは、キーストアにパスワードを設定します。注意すべき点として、証明書のエイリアスは手順1で記載したようにmykeyでなければなりませんが、アイデンティティキーストアにパスワードを指定するだけでOKです。これは以下の手順で実施します。
- [マップの作成]をクリック
- [マップ名]には「SOA」と入力し、[OK]をクリック
- [キーの作成]をクリック
- 以下のようにパスワード欄にSOAアイデンティティキーストアのパスワードを入力
6.テストとトラブルシューティング
セットアップが完了してサーバを再起動すると、Enterprise Manager Fusion Middleware Controlでコンポジットをデプロイし、テストすることができます。エラーが発生する場合は、サーバログをご覧になってエラーの原因を突き詰めて下さい。
例えば、手順5の設定をせずに双方向SSLをテストすると、BPEL PMからOSBを呼び出した際に以下のようなログが現れます。
java.lang.Exception: oracle.sysman.emSDK.webservices.wsdlapi.SoapTestException: oracle.fabric.common.FabricInvocationException: Unable to access the following endpoint(s): https://localhost.localdomain:7002/default/helloword
####<Sep 22, 2012 2:07:37 PM CDT> <Error> <oracle.soa.bpel.engine.ws> <rhel55> <AdminServer> <[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'> <<anonymous>> <BEA1-0AFDAEF20610F8FD89C5>
............
<11d1def534ea1be0:-4034173:139ef56d9f0:-8000-00000000000002ec> <1348340857956> <BEA-000000> <got FabricInvocationException
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
WebLogic ServerのSSLがサーバ証明書をコンソールで利用できるようにせずに、SOAコンポジットをOSBから双方向SSLで呼び出した場合、以下のエラーが発生します。
####<Sep 22, 2012 2:07:37 PM CDT> <Warning> <Security> <rhel55> <AdminServer> <[ACTIVE] ExecuteThread: '6' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <11d1def534ea1be0:-51f5c76a:139ef5e1e1a:-8000-00000000000000e2> <1348340857776> <BEA-090485> <CERTIFICATE_UNKNOWN alert was received from localhost.localdomain - 127.0.0.1. The peer has an unspecified issue with the certificate. SSL debug tracing should be enabled on the peer to determine what the issue is.>
####<Sep 22, 2012 2:07:37 PM CDT> <Warning> <Security> <rhel55> <AdminServer> <[ACTIVE] ExecuteThread: '6' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <11d1def534ea1be0:-51f5c76a:139ef5e1e1a:-8000-00000000000000e4> <1348340857786> <BEA-090485> <CERTIFICATE_UNKNOWN alert was received from localhost.localdomain - 127.0.0.1. The peer has an unspecified issue with the certificate. SSL debug tracing should be enabled on the peer to determine what the issue is.>
####<Sep 22, 2012 2:27:21 PM CDT> <Warning> <Security> <rhel55> <AdminServer> <[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'> <<anonymous>> <> <11d1def534ea1be0:-51f5c76a:139ef5e1e1a:-8000-0000000000000124> <1348342041926> <BEA-090497> <HANDSHAKE_FAILURE alert received from localhost - 127.0.0.1. Check both sides of the SSL configuration for mismatches in supported ciphers, supported protocol versions, trusted CAs, and hostname verification settings.>
参考資料
- Oracle® Fusion Middleware Administrator's Guide for Oracle SOA Suite and Oracle Business Process Management Suite 11g Release 1 (11.1.1.6.3)
Configuring SSL
http://docs.oracle.com/cd/E23943_01/admin.1111/e10226/soacompapp_secure.htm#CHDCFABB
- Oracle® Fusion Middleware Oracle SOA SuiteおよびOracle Business Process Management Suite管理者ガイド 11g リリース1 (11.1.1.6.0)
SSLの構成 http://docs.oracle.com/cd/E28389_01/admin.1111/b55916/soacompapp_secure.htm#CHDCFABB
- Oracle® Fusion Middleware Securing Oracle WebLogic Server 11g Release 1 (10.3.6)
Configuring SSL http://docs.oracle.com/cd/E23943_01/web.1111/e13707/ssl.htm#i1200848
- Oracle® Fusion Middleware Oracle WebLogic Serverの保護 11g リリース1(10.3.6)
SSLの構成
http://docs.oracle.com/cd/E28389_01/web.1111/b61617/ssl.htm#i1200848