6.2. SOAP メッセージ保護
6.2.1. SOAP メッセージ保護の概要
概要
トランスポート層ではなく SOAP エンコーディング層でメッセージ保護を適用することにより、より柔軟な範囲の保護ポリシーにアクセスできます。特に、SOAP レイヤーはメッセージ構造を認識しているため、たとえば、実際に保護が必要なヘッダーのみを暗号化して署名することにより、より細かいレベルで保護を適用できます。この機能により、より高度な多層アーキテクチャーをサポートできます。たとえば、1 つのプレーンテキストヘッダーが中間層 (安全なイントラネット内にある) を対象とし、暗号化されたヘッダーが最終的な宛先 (安全でないパブリックネットワークを介して到達) を対象とする場合があります。
セキュリティーバインディング
WS-SecurityPolicy 仕様で説明されているように、SOAP メッセージを保護するために次のバインディングタイプのいずれかを使用できます。
-
sp:TransportBinding
— トランスポートバインディング は、(たとえば、HTTPS を介して) トランスポートレベルで提供されるメッセージ保護を参照します。このバインディングは、SOAP だけでなく、任意のメッセージタイプを保護するために使用できます。これについては、前のセクション 「トランスポート層のメッセージ保護」 で詳しく説明しています。 -
sp:AsymmetricBinding
— 非対称バインディング は、SOAP メッセージエンコーディング層で提供されるメッセージ保護を指します。保護機能は、非対称暗号 (公開鍵暗号としても知られる) を使用して実装されます。 -
sp:SymmetricBinding
— 対称バインディング は、SOAP メッセージエンコーディング層で提供されるメッセージ保護を指します。保護機能は、対称暗号を使用して実装されます。対称暗号の例は、WS-SecureConversation および Kerberos トークンによって提供されるトークンです。
メッセージ保護
以下の保護性は、メッセージの一部またはすべてのメッセージに適用できます。
- 暗号化。
- 署名。
- signing+encryption (暗号化前の署名)。
- encryption+signing (署名前の暗号化)。
このような保護性は、1 つのメッセージに任意に組み合わせることができます。したがって、メッセージの一部の部分は暗号化のみできますが、メッセージの他の部分には署名のみが使用され、メッセージの他の部分は署名と暗号化の両方が可能です。メッセージの一部を保護を外すこともできます。
メッセージの保護を適用する最も柔軟なオプションは、SOAP 層 (sp:AsymmetricBinding
または sp:SymmetricBinding
) で利用できます。トランスポート層 (sp:TransportBinding
) は、メッセージ 全体 に保護を適用するオプションのみを提供します。
保護するメッセージの一部の指定
現在、Apache CXF を使用すると、SOAP メッセージの以下の部分に署名または暗号化できます。
-
Body: SOAP メッセージの
soap:BODY
要素全体を署名/暗号化します。 - ヘッダー : 1 つ以上の SOAP メッセージヘッダーの署名および暗号化を行います。各ヘッダーの保護品質を個別に指定することができます。
- 添付: SOAP メッセージですべての添付の署名および暗号化を行います。
- 要素: SOAP メッセージで特定の XML 要素の署名や暗号化を行います。
設定のロール
メッセージ保護に必要なすべての詳細がポリシーを使用して指定されるわけではありません。ポリシーは主に、サービスに必要な保護の品質を指定する方法を提供することを目的としています。セキュリティートークンやパスワードなどのサポートの詳細は、個別の製品固有のメカニズムを使用して提供する必要があります。実際には、Apache CXF では Blueprint XML 設定ファイルにいくつかのサポート設定の詳細を提供する必要があります。詳細は、「暗号化キーおよび署名キーの提供」 を参照してください。
6.2.2. 基本的な署名および暗号化シナリオ
概要
ここで説明したシナリオは、クライアントサーバーアプリケーションです。非対称バインディングポリシー が、クライアントとサーバーの間で送受信されるメッセージの SOAP ボディーを暗号化および署名するよう設定されます。
シナリオ例
図6.1「基本的な署名および暗号化シナリオ」 は、基本的な署名と暗号化のシナリオの概要を示しています。これは、非対称バインディングポリシーを WSDL コントラクトのエンドポイントに関連付けることで指定されます。
図6.1 基本的な署名および暗号化シナリオ
シナリオの手順
クライアントが図6.1「基本的な署名および暗号化シナリオ」受信者のエンドポイントで同期操作を呼び出すと、要求メッセージと応答メッセージは次のように処理されます。
送信要求メッセージが WS-SecurityPolicy ハンドラーを通過すると、ハンドラーはクライアントの非対称バインディングポリシーで指定されたポリシーに従ってメッセージを処理します。この例では、ハンドラーは次の処理を実行します。
- Bob の公開鍵を使用して、メッセージの SOAP 本文を暗号化します。
- Alice の秘密鍵を使用して、暗号化された SOAP 本体に署名します。
着信要求メッセージがサーバーの WS-SecurityPolicy ハンドラーを通過すると、ハンドラーはサーバーの非対称バインディングポリシーで指定されたポリシーに従ってメッセージを処理します。この例では、ハンドラーは次の処理を実行します。
- Alice の公開鍵を使用して署名を検証します。
- Bob の秘密鍵を使用して SOAP ボディーを復号します。
送信応答メッセージがサーバーの WS-SecurityPolicy ハンドラーを通過すると、ハンドラーは次の処理を実行します。
- Alice の公開鍵を使用して、メッセージの SOAP ボディーを暗号化します。
- Bob の秘密鍵を使用して、暗号化された SOAP ボディーに署名します。
受信応答メッセージがクライアントの WS-SecurityPolicy ハンドラーを通過するため、ハンドラーは以下の処理を実行します。
- Bob の公開キーを使用して署名を検証します。
- Alice の秘密鍵を使用して SOAP ボディーを復号します。
6.2.3. AsymmetricBinding ポリシーの指定
概要
非対称バインディングポリシーは、非対称キーアルゴリズム (公開/秘密キーの組み合わせ) を使用して SOAP メッセージ保護を実装し、SOAP レイヤーで実装します。非対称バインディングで使用される暗号化および署名アルゴリズムは、SSL/TLS で使用される暗号化および署名アルゴリズムに似ています。ただし、重要な違いは、SOAP メッセージ保護では、保護するメッセージの特定の部分 (たとえば、個々のヘッダー、本文、添付ファイル) を選択できるのに対し、トランスポート層のセキュリティーはメッセージ 全体 に対してのみ機能することです。
ポリシー件名
非対称バインディングポリシーは、エンドポイントポリシーサブジェクトに適用する必要があります (「エンドポイントポリシーサブジェクト」 を参照)。たとえば、ID MutualCertificate10SignEncrypt_IPingService_policy
を持つ非同期バインディングポリシーの場合、以下のようにポリシーをエンドポイントバインディングに適用できます。
<wsdl:binding name="MutualCertificate10SignEncrypt_IPingService" type="i0:IPingService">
<wsp:PolicyReference URI="#MutualCertificate10SignEncrypt_IPingService_policy"/>
...
</wsdl:binding>
構文
AsymmetricBinding
要素の構文は以下のようになります。
<sp:AsymmetricBinding xmlns:sp="..." ... > <wsp:Policy xmlns:wsp="..."> ( <sp:InitiatorToken> <wsp:Policy> ... </wsp:Policy> </sp:InitiatorToken> ) | ( <sp:InitiatorSignatureToken> <wsp:Policy> ... </wsp:Policy> </sp:InitiatorSignatureToken> <sp:InitiatorEncryptionToken> <wsp:Policy> ... </wsp:Policy> </sp:InitiatorEncryptionToken> ) ( <sp:RecipientToken> <wsp:Policy> ... </wsp:Policy> </sp:RecipientToken> ) | ( <sp:RecipientSignatureToken> <wsp:Policy> ... </wsp:Policy> </sp:RecipientSignatureToken> <sp:RecipientEncryptionToken> <wsp:Policy> ... </wsp:Policy> </sp:RecipientEncryptionToken> ) <sp:AlgorithmSuite ... > ... </sp:AlgorithmSuite> <sp:Layout ... > ... </sp:Layout> ? <sp:IncludeTimestamp ... /> ? <sp:EncryptBeforeSigning ... /> ? <sp:EncryptSignature ... /> ? <sp:ProtectTokens ... /> ? <sp:OnlySignEntireHeadersAndBody ... /> ? ... </wsp:Policy> ... </sp:AsymmetricBinding>
サンプルポリシー
例6.4「非対称バインディングの例」 は、署名と暗号化によるメッセージ保護をサポートする非対称バインディングの例を示しています。署名と暗号化は、公開鍵と秘密鍵のペアを使用して (つまり、非対称暗号化を使用して) 実行されます。この例では、署名して暗号化 する 必要があるメッセージのパーツを指定していません。方法は 「暗号化および署名するメッセージの一部の指定」 を参照してください。
例6.4 非対称バインディングの例
<wsp:Policy wsu:Id="MutualCertificate10SignEncrypt_IPingService_policy"> <wsp:ExactlyOne> <wsp:All> <sp:AsymmetricBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy"> <wsp:Policy> <sp:InitiatorToken> <wsp:Policy> <sp:X509Token sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient"> <wsp:Policy> <sp:WssX509V3Token10/> </wsp:Policy> </sp:X509Token> </wsp:Policy> </sp:InitiatorToken> <sp:RecipientToken> <wsp:Policy> <sp:X509Token sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/Never"> <wsp:Policy> <sp:WssX509V3Token10/> </wsp:Policy> </sp:X509Token> </wsp:Policy> </sp:RecipientToken> <sp:AlgorithmSuite> <wsp:Policy> <sp:Basic256/> </wsp:Policy> </sp:AlgorithmSuite> <sp:Layout> <wsp:Policy> <sp:Lax/> </wsp:Policy> </sp:Layout> <sp:IncludeTimestamp/> <sp:EncryptSignature/> <sp:OnlySignEntireHeadersAndBody/> </wsp:Policy> </sp:AsymmetricBinding> <sp:Wss10 xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy"> <wsp:Policy> <sp:MustSupportRefKeyIdentifier/> <sp:MustSupportRefIssuerSerial/> </wsp:Policy> </sp:Wss10> </wsp:All> </wsp:ExactlyOne> </wsp:Policy>
sp:InitiatorToken
イニシエータートークン は、イニシエーターが所有する公開鍵/秘密鍵のペアを参照します。このトークンは以下のように使用されます。
- トークンの秘密鍵は、イニシエーターから受信者に送信されるメッセージに署名します。
- トークンの公開鍵は、受信側が受信した署名を検証します。
- トークンの公開鍵は、受信者からイニシエーターに送信されるメッセージを暗号化します。
- トークンの秘密鍵は、イニシエーターが受信したメッセージを復号します。
このトークンは、イニシエーターと受信者の両方で使用されます。ただし、イニシエーターのみが秘密鍵にアクセスできるようにするため、トークンはイニシエーターに所属することができます。「基本的な署名および暗号化シナリオ」 では、イニシエータートークンは証明書 Alice です。
この要素には、以下のようにネストされた wsp:Policy
要素と sp:X509Token
要素が含まれている必要があります。sp:IncludeToken
属性は AlwaysToRecipient
に設定され、受信者に送信されるすべてのメッセージに Alice の公開鍵を含めるようランタイムに指示します。このオプションは、受信側がイニシエーターの証明書を使用して認証を行う場合に便利です。最も深くネストされた要素 WssX509V3Token10
はオプションになります。X.509 証明書に準拠する仕様バージョンを指定します。以下の代替方法 (または none) をここで指定できます。
- sp:WssX509V3Token10
- これは任意の要素で、X509 Version 3 トークンを使用する必要があることを示すポリシーアサーションです。
- sp:WssX509Pkcs7Token10
- この任意の要素は、X509 PKCS7 トークンを使用する必要があることを示すポリシーアサーションです。
- sp:WssX509PkiPathV1Token10
- これは任意の要素で、X509 PKI Path Version 1 トークンを使用する必要があることを示すポリシーアサーションです。
- sp:WssX509V1Token11
- これは任意の要素で、X509 Version 1 トークンを使用する必要があることを示すポリシーアサーションです。
- sp:WssX509V3Token11
- これは任意の要素で、X509 Version 3 トークンを使用する必要があることを示すポリシーアサーションです。
- sp:WssX509Pkcs7Token11
- この任意の要素は、X509 PKCS7 トークンを使用する必要があることを示すポリシーアサーションです。
- sp:WssX509PkiPathV1Token11
- これは任意の要素で、X509 PKI Path Version 1 トークンを使用する必要があることを示すポリシーアサーションです。
sp:RecipientToken
受信側トークン は、受信側が所有する公開鍵/秘密鍵のペアを参照します。このトークンは以下のように使用されます。
- トークンの公開鍵は、イニシエーターから受信者に送信されるメッセージを暗号化します。
- トークンの秘密鍵は、受信側によって受信されるメッセージを復号化します。
- トークンの秘密鍵は、受信者からイニシエーターに送信されるメッセージに署名します。
- トークンの公開キーは、イニシエーターが受信した署名を検証します。
このトークンは、受信側 と イニシエーターの両方で使用されます。ただし、受信側のみが秘密鍵にアクセスできるため、その場合はトークンを受信者に所属することができます。「基本的な署名および暗号化シナリオ」 では、受信側トークンは証明書 Bob です。
この要素には、以下のようにネストされた wsp:Policy
要素と sp:X509Token
要素が含まれている必要があります。リプライメッセージに Bob の公開鍵を含める必要がないため、sp:IncludeToken
属性は Never
に設定されます。
Apache CXF では、Bob の証明書と Alice の証明書が接続の最後で提供されるため、メッセージに Bob または Alice のトークンを送信する必要はありません。「暗号化キーおよび署名キーの提供」 を参照してください。
sp:AlgorithmSuite
この要素は、署名と暗号化に使用する一連の暗号化アルゴリズムを指定します。利用可能なアルゴリズムスイートの詳細は、「アルゴリズムスイートの指定」 を参照してください。
sp:Layout
この要素は、セキュリティーヘッダーが SOAP メッセージに追加される順序で条件を適用するかどうかを指定します。sp:Lax
要素は、セキュリティーヘッダーの順序に条件を課さないことを指定します。sp:Lax
の代替は、sp:Strict
、sp:LaxTimestampFirst
、または sp:LaxTimestampLast
です。
sp:IncludeTimestamp
この要素がポリシーに含まれる場合、ランタイムは wsu:Timestamp
要素を wsse:Security
ヘッダーに追加します。デフォルトでは、タイムスタンプは含まれ ません。
sp:EncryptBeforeSigning
メッセージ部分が暗号化と署名の両方に依存する場合は、これらの操作が実行される順序を指定する必要があります。デフォルトの順序は、暗号化前に署名することです。ただし、非対称ポリシーにこの要素を含めると、署名前に暗号化するように順序が変更されます。
この要素は暗黙的に復号化および署名の検証操作の順序にも影響します。たとえば、暗号化前にメッセージ署名の送信者が送信される場合、メッセージの受信側は署名を検証する前に復号化する必要があります。
sp:EncryptSignature
この要素は、「暗号化キーおよび署名キーの提供」で指定されている暗号化トークンによって、メッセージ署名を暗号化する必要があることを指定します。デフォルトは false です。
メッセージ署名 は、メッセージのボディー、メッセージヘッダー、個々の要素など、メッセージのさまざまな部分に署名することで直接取得された署名です (「暗号化および署名するメッセージの一部の指定」 を参照してください)。WS-SecurityPolicy 仕様は プライマリー署名の署名 に使用される終了トークンの概念をサポートするため、メッセージの署名はプライマリー署名と呼ばれることがあります。したがって、sp:EndorsingSupportingTokens
要素がエンドポイントに適用される場合、署名チェーン (メッセージ自体に署名するプライマリー署名とプライマリー署名に署名するセカンダリー署名) を持つことができます。
各種のエンドツーエンドのサポートトークンに関する詳細は、「SupportingTokens アサーション」 を参照してください。
sp:ProtectTokens
この要素は、署名がその署名の生成に使用されるトークンに対応する必要があるように指定します。デフォルトは false です。
sp:OnlySignEntireHeadersAndBody
この要素は、ヘッダーボディーまたはサブ要素のサブ要素ではなく、本文全体またはヘッダー全体に のみ、署名を適用できることを指定します。このオプションを有効にすると、実質的に sp:SignedElements
アサーションを使用できなくなります (「暗号化および署名するメッセージの一部の指定」 を参照)。
6.2.4. SymmetricBinding ポリシーの指定
概要
symmetric binding ポリシーは、対称鍵アルゴリズム (共有秘密鍵) を使用して SOAP メッセージ保護を実装し、SOAP レイヤーで行います。対称バインディングの例は、Kerberos プロトコルおよび WS-SecureConversation プロトコルです。
現在、Apache CXF は対称バインディングの WS-SecureConversation トークン のみ をサポートします。
ポリシー件名
symmetric binding ポリシーはエンドポイントポリシーサブジェクトに適用する必要があります (「エンドポイントポリシーサブジェクト」 を参照してください)。たとえば、ID SecureConversation_MutualCertificate10SignEncrypt_IPingService_policy
を持つ同期バインディングポリシーの場合、以下のようにポリシーをエンドポイントバインディングに適用できます。
<wsdl:binding name="SecureConversation_MutualCertificate10SignEncrypt_IPingService" type="i0:IPingService">
<wsp:PolicyReference URI="#SecureConversation_MutualCertificate10SignEncrypt_IPingService_policy"/>
...
</wsdl:binding>
構文
SymmetricBinding
要素の構文は以下のようになります。
<sp:SymmetricBinding xmlns:sp="..." ... > <wsp:Policy xmlns:wsp="..."> ( <sp:EncryptionToken ... > <wsp:Policy> ... </wsp:Policy> </sp:EncryptionToken> <sp:SignatureToken ... > <wsp:Policy> ... </wsp:Policy> </sp:SignatureToken> ) | ( <sp:ProtectionToken ... > <wsp:Policy> ... </wsp:Policy> </sp:ProtectionToken> ) <sp:AlgorithmSuite ... > ... </sp:AlgorithmSuite> <sp:Layout ... > ... </sp:Layout> ? <sp:IncludeTimestamp ... /> ? <sp:EncryptBeforeSigning ... /> ? <sp:EncryptSignature ... /> ? <sp:ProtectTokens ... /> ? <sp:OnlySignEntireHeadersAndBody ... /> ? ... </wsp:Policy> ... </sp:SymmetricBinding>
サンプルポリシー
例6.5「対称バインディングの例」 は、署名と暗号化によるメッセージ保護をサポートする対称バインディングの例を示しています。署名と暗号化は、単一の対称鍵を使用して (つまり、対称暗号化を使用して) 実行されます。この例では、署名して暗号化 する 必要があるメッセージのパーツを指定していません。方法は 「暗号化および署名するメッセージの一部の指定」 を参照してください。
例6.5 対称バインディングの例
<wsp:Policy wsu:Id="SecureConversation_MutualCertificate10SignEncrypt_IPingService_policy"> <wsp:ExactlyOne> <wsp:All> <sp:SymmetricBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy"> <wsp:Policy> <sp:ProtectionToken> <wsp:Policy> <sp:SecureConversationToken> ... </sp:SecureConversationToken> </wsp:Policy> </sp:ProtectionToken> <sp:AlgorithmSuite> <wsp:Policy> <sp:Basic256/> </wsp:Policy> </sp:AlgorithmSuite> <sp:Layout> <wsp:Policy> <sp:Lax/> </wsp:Policy> </sp:Layout> <sp:IncludeTimestamp/> <sp:EncryptSignature/> <sp:OnlySignEntireHeadersAndBody/> </wsp:Policy> </sp:SymmetricBinding> <sp:Wss10 xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy"> <wsp:Policy> <sp:MustSupportRefKeyIdentifier/> <sp:MustSupportRefIssuerSerial/> </wsp:Policy> </sp:Wss10> ... </wsp:All> </wsp:ExactlyOne> </wsp:Policy>
sp:ProtectionToken
この要素は、メッセージの署名と暗号化の両方に使用する対称トークンを指定します。たとえば、ここで WS-SecureConversation トークンを指定できます。
個別のトークンを署名および暗号化操作に使用する場合は、この要素の代わりに sp:SignatureToken
要素と sp:EncryptionToken
要素を使用します。
sp:SignatureToken
この要素は、メッセージの署名に使用する対称トークンを指定します。これは、sp:EncryptionToken
要素と組み合わせて使用する必要があります。
sp:EncryptionToken
この要素は、メッセージの暗号化に使用する対称トークンを指定します。これは、sp:SignatureToken
要素と組み合わせて使用する必要があります。
sp:AlgorithmSuite
この要素は、署名と暗号化に使用する一連の暗号化アルゴリズムを指定します。利用可能なアルゴリズムスイートの詳細は、「アルゴリズムスイートの指定」 を参照してください。
sp:Layout
この要素は、セキュリティーヘッダーが SOAP メッセージに追加される順序で条件を適用するかどうかを指定します。sp:Lax
要素は、セキュリティーヘッダーの順序に条件を課さないことを指定します。sp:Lax
の代替は、sp:Strict
、sp:LaxTimestampFirst
、または sp:LaxTimestampLast
です。
sp:IncludeTimestamp
この要素がポリシーに含まれる場合、ランタイムは wsu:Timestamp
要素を wsse:Security
ヘッダーに追加します。デフォルトでは、タイムスタンプは含まれ ません。
sp:EncryptBeforeSigning
メッセージ部分が暗号化と署名の両方に依存する場合は、これらの操作が実行される順序を指定する必要があります。デフォルトの順序は、暗号化前に署名することです。ただし、対称ポリシーにこの要素を含めると、署名前に暗号化するように順序が変更されます。
この要素は暗黙的に復号化および署名の検証操作の順序にも影響します。たとえば、暗号化前にメッセージ署名の送信者が送信される場合、メッセージの受信側は署名を検証する前に復号化する必要があります。
sp:EncryptSignature
この要素は、メッセージ署名を暗号化する必要があることを指定します。デフォルトは false です。
sp:ProtectTokens
この要素は、署名がその署名の生成に使用されるトークンに対応する必要があるように指定します。デフォルトは false です。
sp:OnlySignEntireHeadersAndBody
この要素は、ヘッダーボディーまたはサブ要素のサブ要素ではなく、本文全体またはヘッダー全体に のみ、署名を適用できることを指定します。このオプションを有効にすると、実質的に sp:SignedElements
アサーションを使用できなくなります (「暗号化および署名するメッセージの一部の指定」 を参照)。
6.2.5. 暗号化および署名するメッセージの一部の指定
概要
暗号化と署名は、それぞれ機密性と整合性の 2 種類の保護を提供します。WS-SecurityPolicy の保護アサーションは、メッセージの どの 部分を保護するかを指定するために使用されます。一方、保護メカニズムの詳細は、関連するバインディングポリシー (x「AsymmetricBinding ポリシーの指定」、「SymmetricBinding ポリシーの指定」、および 「トランスポート層のメッセージ保護」を参照) で個別に指定されます。
ここで説明する保護アサーションは、SOAP メッセージの機能に適用されるため、SOAP セキュリティーと組み合わせて使用することが意図されています。ただし、これらのポリシーは、特定の部分ではなくメッセージ 全体 に対して保護を適用するトランスポートバインディング (HTTPS など) によっても満たされます。
ポリシー件名
保護アサーションは、メッセージポリシーの件名 に適用する必要があります (「メッセージポリシー件名」 を参照)。つまり、WSDL バインディングの wsdl:input
、wsdl:output
、または wsdl:fault
要素内に配置する必要があります。たとえば、ID MutualCertificate10SignEncrypt_IPingService_header_Input_policy
を使用した保護ポリシーでは、以下のように wsdl:input
メッセージにポリシーを適用することができます。
<wsdl:operation name="header">
<soap:operation soapAction="http://InteropBaseAddress/interop/header" style="document"/>
<wsdl:input name="headerRequest">
<wsp:PolicyReference
URI="#MutualCertificate10SignEncrypt_IPingService_header_Input_policy"/>
<soap:header message="i0:headerRequest_Headers" part="CustomHeader" use="literal"/>
<soap:body use="literal"/>
</wsdl:input>
...
</wsdl:operation>
保護アサーション
Apache CXF では、以下の WS-SecurityPolicy の保護アサーションがサポートされます。
-
SignedParts
-
EncryptedParts
-
SignedElements
-
EncryptedElements
-
ContentEncryptedElements
-
RequiredElements
-
RequiredParts
構文
SignedParts
要素の構文は以下のようになります。
<sp:SignedParts xmlns:sp="..." ... > <sp:Body />? <sp:Header Name="xs:NCName"? Namespace="xs:anyURI" ... />* <sp:Attachments />? ... </sp:SignedParts>
EncryptedParts
要素の構文は以下のようになります。
<sp:EncryptedParts xmlns:sp="..." ... > <sp:Body/>? <sp:Header Name="xs:NCName"? Namespace="xs:anyURI" ... />* <sp:Attachments />? ... </sp:EncryptedParts>
サンプルポリシー
例6.6「整合性および暗号化ポリシーの評価」 は、署名済みの部分アサーションと暗号化されたパーツアサーションの 2 つの保護アサーションを組み合わせるポリシーを示しています。このポリシーがメッセージ部分に適用されると、影響を受けるメッセージボディーは署名され、暗号化されます。また、CustomHeader
という名前のメッセージヘッダーは署名されます。
例6.6 整合性および暗号化ポリシーの評価
<wsp:Policy wsu:Id="MutualCertificate10SignEncrypt_IPingService_header_Input_policy"> <wsp:ExactlyOne> <wsp:All> <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy"> <sp:Body/> <sp:Header Name="CustomHeader" Namespace="http://InteropBaseAddress/interop"/> </sp:SignedParts> <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy"> <sp:Body/> </sp:EncryptedParts> </wsp:All> </wsp:ExactlyOne> </wsp:Policy>
sp:Body
この要素は、保護 (暗号化または署名) がメッセージの本文に適用されることを指定します。保護は、メッセージボディー 全体 (つまり soap:Body
要素、その属性、およびそのコンテンツ) に適用されます。
sp:Header
この要素は、Name
属性を使用したヘッダーのローカル名および Namespace
属性を使用した namespace で指定された SOAP ヘッダーに保護が適用されるように指定します。保護は、属性とコンテンツを含むメッセージヘッダー 全体 に適用されます。
sp:Attachments
この要素は、添付ファイル付きのすべての SOAP (SwA) 添付ファイルが保護されることを指定します。
6.2.6. 暗号化キーおよび署名キーの提供
概要
標準の WS-SecurityPolicy ポリシーは、セキュリティープロトコル、セキュリティーアルゴリズム、トークンタイプ、認証 要件 など、セキュリティー要件の詳細を指定するように設計されています。ただし、標準のポリシーアサーションは、キーやクレデンシャルなどの関連するセキュリティーデータを指定するためのメカニズムを提供しません。WS-SecurityPolicy は、必要なセキュリティーデータが独自のメカニズムを通じて提供されることを期待しています。Apache CXF では、関連するセキュリティーデータはブループリント XML 設定を通じて提供されます。
暗号化キーおよび署名キーの設定
クライアントのリクエストコンテキストまたはエンドポイントコンテキストでプロパティーを設定することで、アプリケーションの暗号化キーと署名キーを指定できます (「Blueprint 設定への暗号化および署名プロパティーの追加」 を参照)。設定可能なプロパティーは 表6.1「暗号化プロパティーおよび署名プロパティー」 に表示されます。
プロパティー | 説明 |
---|---|
|
署名キーストアを設定するための WSS4J プロパティーが含まれる WSS4J プロパティーファイル/オブジェクト (復号化にも使用) および |
| (オプション) 使用する署名キーストア内のキーのユーザー名またはエイリアス。指定のない場合は、プロパティーファイルに設定されたエイリアスが使用されます。これが設定されておらず、キーストアに単一のキーのみが含まれる場合は、そのキーが使用されます。 |
|
暗号化キーストアを設定するための WSS4J プロパティーを含む WSS4J プロパティーファイル/オブジェクト (署名の検証にも使用) および |
| (オプション) 使用する暗号化キーストア内のキーのユーザー名またはエイリアス。指定のない場合は、プロパティーファイルに設定されたエイリアスが使用されます。これが設定されておらず、キーストアに単一のキーのみが含まれる場合は、そのキーが使用されます。 |
上記のプロパティーの名前は、使用目的を正確に反映していないため、あまり適切に選択されていません。security.signature.properties
で指定されるキーは、実際には署名 および 復号化の両方に使用されます。security.encryption.properties
で指定されるキーは、署名の暗号化 および 検証の両方に使用されます。
Blueprint 設定への暗号化および署名プロパティーの追加
Apache CXF アプリケーションで WS-Policy ポリシーを使用する前に、ポリシー機能をデフォルトの CXF バスに追加する必要があります。以下の Blueprint 設定のフラグメントに示されるように、p:policies
要素を CXF バスに追加します。
<beans xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:cxf="http://cxf.apache.org/core"
xmlns:p="http://cxf.apache.org/policy" ... >
<cxf:bus>
<cxf:features>
<p:policies/>
<cxf:logging/>
</cxf:features>
</cxf:bus>
...
</beans>
以下の例は、署名および暗号化プロパティーを指定されたサービスタイプのプロキシーに追加する方法を示しています (サービス名は jaxws:client
要素の name
属性で指定されます)。プロパティーは WSS4J プロパティーファイルに格納されます。alice.properties
には署名キーのプロパティーが含まれ、bob.properties
には暗号化キーのプロパティーが含まれます。
<beans ... > <jaxws:client name="{http://InteropBaseAddress/interop}MutualCertificate10SignEncrypt_IPingService" createdFromAPI="true"> <jaxws:properties> <entry key="ws-security.signature.properties" value="etc/alice.properties"/> <entry key="ws-security.encryption.properties" value="etc/bob.properties"/> </jaxws:properties> </jaxws:client> ... </beans>
実際、プロパティー名からは明らかではありませんが、これらの各キーは、クライアント側で 2 つの異なる目的に使用されます。
alice.properties
(security.signature.properties
で指定されたキー) は以下のようにクライアント側で使用されます。- 送信メッセージに署名するため
- 受信メッセージの復号化
bob.properties
(security.encryption.properties
で指定されたキー) は以下のようにクライアント側で使用されます。- 送信メッセージを暗号化するために使用します。
- 受信メッセージの署名を検証するため。
これが混乱した場合は、「基本的な署名および暗号化シナリオ」 で詳細の説明を参照してください。
以下の例は、署名および暗号化プロパティーを JAX-WS エンドポイントに追加する方法を示しています。プロパティーファイル bob.properties
には署名キーのプロパティーが含まれ、プロパティーファイル alice.properties
には暗号化キーのプロパティーが含まれます (これはクライアント設定の逆になります)。
<beans ... > <jaxws:endpoint name="{http://InteropBaseAddress/interop}MutualCertificate10SignEncrypt_IPingService" id="MutualCertificate10SignEncrypt" address="http://localhost:9002/MutualCertificate10SignEncrypt" serviceName="interop:PingService10" endpointName="interop:MutualCertificate10SignEncrypt_IPingService" implementor="interop.server.MutualCertificate10SignEncrypt"> <jaxws:properties> <entry key="security.signature.properties" value="etc/bob.properties"/> <entry key="security.encryption.properties" value="etc/alice.properties"/> </jaxws:properties> </jaxws:endpoint> ... </beans>
これらのキーはそれぞれ、サーバー側で 2 つの異なる目的で使用されます。
bob.properties
(security.signature.properties
で指定されたキー) は以下のようにサーバー側で使用されます。- 送信メッセージに署名するため
- 受信メッセージの復号化
alice.properties
(security.encryption.properties
で指定されたキー) は以下のようにサーバー側で使用されます。- 送信メッセージを暗号化するために使用します。
- 受信メッセージの署名を検証するため。
WSS4J プロパティーファイルの定義
Apache CXF は WSS4J プロパティーファイルを使用して、暗号化と署名に必要な公開鍵と秘密鍵をロードします。表6.2「WSS4J Keystore プロパティー」 は、これらのファイルに設定できるプロパティーを説明します。
プロパティー | 説明 |
---|---|
|
この表のその他のプロパティーは、 |
|
(オプション) 使用する JSSE 鍵ストアプロバイダーの名前。デフォルトのキーストアプロバイダーは Bouncy Castle です。このプロパティーを |
|
Bouncy Castle キーストアプロバイダーは、 |
| ロードするキーストアファイルの場所を指定します。場所はクラスパスを基準にして指定されます。 |
|
(オプション) キーストアタイプが |
| このプロパティーで指定されたパスワードは、キーストアのロックを解除する (キーストアパスワード) と、キーストアに格納されている秘密キーを復号化する (秘密キーパスワード) という 2 つの目的で使用されます。そのため、キーストアのパスワードは秘密鍵のパスワードと同じである必要があります。 |
たとえば、etc/alice.properties
ファイルには、以下のように PKCS#12 ファイル certs/alice.pfx
をロードするためのプロパティー設定が含まれています。
org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin org.apache.ws.security.crypto.merlin.keystore.type=PKCS12 org.apache.ws.security.crypto.merlin.keystore.password=password org.apache.ws.security.crypto.merlin.keystore.file=certs/alice.pfx
etc/bob.properties
ファイルには、以下のように PKCS#12 ファイル certs/bob.pfx
をロードするためのプロパティー設定が含まれています。
org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin org.apache.ws.security.crypto.merlin.keystore.password=password # for some reason, bouncycastle has issues with bob.pfx org.apache.ws.security.crypto.merlin.keystore.provider=SunJSSE org.apache.ws.security.crypto.merlin.keystore.type=PKCS12 org.apache.ws.security.crypto.merlin.keystore.file=certs/bob.pfx
暗号化キーおよび署名キーのプログラミング
暗号化キーと署名キーをロードする別の方法は、表6.3「暗号オブジェクトを指定するプロパティー」 に示すプロパティーを使用して、関連するキーをロードする Crypto
オブジェクトを指定することです。これは、WSS4J Crypto
インタフェース org.apache.ws.security.components.crypto.Crypto
の独自の実装を提供する必要があります。
プロパティー | 説明 |
---|---|
|
メッセージの署名および復号化の鍵のロードを担当する |
|
メッセージの暗号化および署名の検証を行う鍵のロードを担当する |
WSS4J Crypto インターフェイス
例6.7「WSS4J Crypto インターフェイス」 は、プログラミングで暗号キーと署名キーを提供する場合は、実装できる Crypto
インターフェイスの定義を示しています。詳細は、WSS4J ホームページ を参照してください。
例6.7 WSS4J Crypto インターフェイス
// Java package org.apache.ws.security.components.crypto; import org.apache.ws.security.WSSecurityException; import java.io.InputStream; import java.math.BigInteger; import java.security.KeyStore; import java.security.PrivateKey; import java.security.cert.Certificate; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; public interface Crypto { X509Certificate loadCertificate(InputStream in) throws WSSecurityException; X509Certificate[] getX509Certificates(byte[] data, boolean reverse) throws WSSecurityException; byte[] getCertificateData(boolean reverse, X509Certificate[] certs) throws WSSecurityException; public PrivateKey getPrivateKey(String alias, String password) throws Exception; public X509Certificate[] getCertificates(String alias) throws WSSecurityException; public String getAliasForX509Cert(Certificate cert) throws WSSecurityException; public String getAliasForX509Cert(String issuer) throws WSSecurityException; public String getAliasForX509Cert(String issuer, BigInteger serialNumber) throws WSSecurityException; public String getAliasForX509Cert(byte[] skiBytes) throws WSSecurityException; public String getDefaultX509Alias(); public byte[] getSKIBytesFromCert(X509Certificate cert) throws WSSecurityException; public String getAliasForX509CertThumb(byte[] thumb) throws WSSecurityException; public KeyStore getKeyStore(); public CertificateFactory getCertificateFactory() throws WSSecurityException; public boolean validateCertPath(X509Certificate[] certs) throws WSSecurityException; public String[] getAliasesForDN(String subjectDN) throws WSSecurityException; }
6.2.7. アルゴリズムスイートの指定
概要
アルゴリズムスイートは、署名、暗号化、メッセージダイジェストの生成などの操作を実行する暗号化アルゴリズムの一貫したコレクションです。
ここでは、WS-SecurityPolicy 仕様で定義されたアルゴリズムスイートを説明します。ただし、特定のアルゴリズムスイートを利用できるかどうかは、基礎となるセキュリティープロバイダーによって異なります。Apache CXF セキュリティーは、プラグイン可能な Java Cryptography Extension (JCE) および Java Secure Socket Extension (JSSE) レイヤーに基づいています。デフォルトでは、Apache CXF は Sun の JSSE プロバイダーで設定されています。このプロバイダーは、Sun の JSSE リファレンスガイド の 付録 A で説明されている暗号スイートをサポートしています。
構文
AlgorithmSuite
要素の構文は以下のようになります。
<sp:AlgorithmSuite xmlns:sp="..." ... > <wsp:Policy xmlns:wsp="..."> (<sp:Basic256 ... /> | <sp:Basic192 ... /> | <sp:Basic128 ... /> | <sp:TripleDes ... /> | <sp:Basic256Rsa15 ... /> | <sp:Basic192Rsa15 ... /> | <sp:Basic128Rsa15 ... /> | <sp:TripleDesRsa15 ... /> | <sp:Basic256Sha256 ... /> | <sp:Basic192Sha256 ... /> | <sp:Basic128Sha256 ... /> | <sp:TripleDesSha256 ... /> | <sp:Basic256Sha256Rsa15 ... /> | <sp:Basic192Sha256Rsa15 ... /> | <sp:Basic128Sha256Rsa15 ... /> | <sp:TripleDesSha256Rsa15 ... /> | ...) <sp:InclusiveC14N ... /> ? <sp:SOAPNormalization10 ... /> ? <sp:STRTransform10 ... /> ? (<sp:XPath10 ... /> | <sp:XPathFilter20 ... /> | <sp:AbsXPath ... /> | ...)? ... </wsp:Policy> ... </sp:AlgorithmSuite>
アルゴリズムスイートのアサーションは、多数の代替アルゴリズム (例: Basic256
) をサポートします。代替アルゴリズムスイートの詳細は、表6.4「アルゴリズムスイート」 を参照してください。
アルゴリズムスイート
表6.4「アルゴリズムスイート」 WS-SecurityPolicy によってサポートされるアルゴリズムスイートの概要を示します。列見出しは、次のようにさまざまなタイプの暗号化アルゴリズムを示しています。\[Dig] はダイジェストアルゴリズムです。\[Enc] は暗号化アルゴリズムです。\[Sym KW] は対称鍵ラップアルゴリズムです。\[Asym KW] は非対称キーラップアルゴリズムです。\[Enc KD] は、暗号化キー導出アルゴリズムです。\[Sig KD] は、署名鍵導出アルゴリズムです。
アルゴリズムスイート | \[Dig] | \[Enc] | \[Sym KW] | \[Asym KW] | \[Enc KD] | \[Sig KD] |
---|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
暗号化アルゴリズムのタイプ
WS-SecurityPolicy では、以下のタイプの暗号化アルゴリズムがサポートされます。
対称キー署名
対称キー署名プロパティー [Sym Sig] は、対称キーを使用して署名を生成するアルゴリズムを指定します。WS-SecurityPolicy は、HmacSha1
アルゴリズムを常に使用するように指定します。
HmacSha1
アルゴリズムは、以下の URI で識別されます。
http://www.w3.org/2000/09/xmldsig#hmac-sha1
非対称鍵の署名
非対称鍵の署名プロパティー [Asym Sig] は、非対称キーを使用して署名を生成するアルゴリズムを指定します。WS-SecurityPolicy は、RsaSha1
アルゴリズムを常に使用するように指定します。
RsaSha1
アルゴリズムは、以下の URI で識別されます。
http://www.w3.org/2000/09/xmldsig#rsa-sha1
Digest
digest プロパティー [Dig] は、メッセージダイジェスト値の生成に使用されるアルゴリズムを指定します。WS-SecurityPolicy は、2 つの代替ダイジェストアルゴリズム (Sha1
および Sha256
) をサポートします。
Sha1
アルゴリズムは、以下の URI で識別されます。
http://www.w3.org/2000/09/xmldsig#sha1
Sha256
アルゴリズムは、以下の URI で識別されます。
http://www.w3.org/2001/04/xmlenc#sha256
暗号化
暗号化プロパティー [Enc] は、データの暗号化に使用されるアルゴリズムを指定します。WS-SecurityPolicy は、Aes256
、Aes192
、Aes128
、TripleDes
の暗号化アルゴリズムをサポートします。
Aes256
アルゴリズムは、以下の URI で識別されます。
http://www.w3.org/2001/04/xmlenc#aes256-cbc
Aes192
アルゴリズムは、以下の URI で識別されます。
http://www.w3.org/2001/04/xmlenc#aes192-cbc
Aes128
アルゴリズムは、以下の URI で識別されます。
http://www.w3.org/2001/04/xmlenc#aes128-cbc
TripleDes
アルゴリズムは、以下の URI で識別されます。
http://www.w3.org/2001/04/xmlenc#tripledes-cbc
対称キーラッピング
対称キーラッピングプロパティー [Sym KW] は、対称鍵の署名および暗号化に使用されるアルゴリズムを指定します。WS-SecurityPolicy は、対称鍵ラップアルゴリズムの KwAes256
、KwAes192
、KwAes128
、KwTripleDes
をサポートします。
KwAes256
アルゴリズムは、以下の URI で識別されます。
http://www.w3.org/2001/04/xmlenc#kw-aes256
KwAes192
アルゴリズムは、以下の URI で識別されます。
http://www.w3.org/2001/04/xmlenc#kw-aes192
KwAes128
アルゴリズムは、以下の URI で識別されます。
http://www.w3.org/2001/04/xmlenc#kw-aes128
KwTripleDes
アルゴリズムは、以下の URI で識別されます。
http://www.w3.org/2001/04/xmlenc#tripledes-cbc
非対称キーラッピング
非対称キーラッププロパティー [Asym KW] は、非対称キーの署名と暗号化に使用されるアルゴリズムを指定します。WS-SecurityPolicy は、非対称鍵ラップアルゴリズムの KwRsaOaep
と KwRsa15
をサポートします。
KwRsaOaep
アルゴリズムは、以下の URI で識別されます。
http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p
KwRsa15
アルゴリズムは、以下の URI で識別されます。
http://www.w3.org/2001/04/xmlenc#rsa-1_5
コンピュートキー
コンピュートキープロパティー [Comp Key] は、派生された鍵の計算に使用されるアルゴリズムを指定します。セキュアな参加者が共有秘密鍵の ID と通信する場合 (WS-SecureConversation を使用する場合など)、悪意のあるサードパーティーによる分析に過剰なデータが公開されないように、元の共有キーの代わりに派生キーを使用することが推奨されます。WS-SecurityPolicy は、PSha1
アルゴリズムを常に使用するように指定します。
PSha1
アルゴリズムは、以下の URI で識別されます。
http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512/dk/p_sha1
暗号化キー導出
暗号化キー導出プロパティー [Enc KD] は、派生した暗号化キーの計算に使用するアルゴリズムを指定します。WS-SecurityPolicy は、PSha1L256
、PSha1L192
、PSha1L128
の暗号化キーの派生アルゴリズムをサポートします。
PSha1
アルゴリズムは以下の URI で識別されます (PSha1L256
、PSha1L192
、および PSha1L128
に同じアルゴリズムが使用されます。キーの長さのみが異なります)。
http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512/dk/p_sha1
署名鍵導出
署名キー導出プロパティー [Sig KD] は、派生署名キーの計算に使用されるアルゴリズムを指定します。WS-SecurityPolicy は、PSha1L192
、PSha1L128
の署名キーの派生アルゴリズムをサポートします。
キー長のプロパティー
表6.5「キー長のプロパティー」 は、WS-SecurityPolicy でサポートされるキーの最小および最大の長さを示しています。
プロパティー | キーの長さ |
---|---|
最小対称キーの長さ [Min SKL] | 128, 192, 256 |
対称キーの最大長 [Max SKL] | 256 |
非対称キーの最小長 [Min AKL] | 1024 |
非対称キーの最大長 [Max AKL] | 4096 |
最小対称鍵長の値 [Min SKL] は、選択されているアルゴリズムスイートによって異なります。