XML 署名の検証に関する簡単な説明およびコード例については、Adobe Developer Connection で次のクイックスタートの記事を参照してください。
Adobe® AIR® は、XML 署名を検証するための XMLSignatureValidator クラスと IURIDereferencer インターフェイスを備えています。XMLSignatureValidator クラスが受け入れる XML シンタックスは、W3C 勧告「XML Signature Syntax and Processing」のサブセットです(この勧告のサブセットのみがサポートされているので、すべての法的署名を検証できるわけではありません)。AIR には、XML 署名を作成するための API はありません。
XML 署名の検証クラス
XML 署名の検証 API には、次のクラスが含まれます。
パッケージ
|
クラス
|
flash.security
|
XMLSignatureValidator のストリング定数は、次のクラスで定義されています。
|
flash.events
|
|
XML 署名の検証クラスの使用
XMLSignatureValidator クラスを使用して XML 署名を検証するには、次の操作を行う必要があります。
-
XMLSignatureValidator オブジェクトを作成します。
-
IURIDereferencer インターフェイスの実装を用意します。XMLSignatureValidator オブジェクトは IURIDereferencer の
dereference()
メソッドを呼び出して、署名内の各参照の URI を渡します。
dereference()
メソッドは URI を解決し、参照先のデータを返す必要があります(参照先のデータは、同じドキュメント内に署名として含めることも、外部リソースに含めることもできます)。
-
アプリケーションに応じて、XMLSignatureValidator オブジェクトの、証明書の信頼、失効のチェックおよび参照の検証に関する設定を行います。
-
complete
イベントと
error
イベントのイベントリスナーを追加します。
-
verify()
メソッドを呼び出して、検証する署名を渡します。
-
complete
イベントと
error
イベントを処理し、結果を解釈します。
次の例では、XML 署名の有効性を検証する
validate()
関数を実装します。XMLSignatureValidator のプロパティは、署名証明書がシステムの信頼ストアにあるか信頼ストアの証明書にチェーン化される必要があるように設定されています。また、この例では、
XMLDereferencer
という名前の適切な IURIDereferencer クラスが存在することを前提としています。
private function validate( xmlSignature:XML ):void
{
var verifier:XMLSignatureValidator = new XMLSignatureValidator();
verifier.addEventListener(Event.COMPLETE, verificationComplete);
verifier.addEventListener(ErrorEvent.ERROR, verificationError);
try
{
verifier.uriDereferencer = new XMLDereferencer();
verifier.referencesValidationSetting =
ReferencesValidationSetting.VALID_IDENTITY;
verifier.revocationCheckSetting = RevocationCheckSettings.BEST_EFFORT;
verifier.useSystemTrustStore = true;
//Verify the signature
verifier.verify( xmlSignature );
}
catch (e:Error)
{
trace("Verification error.\n" + e);
}
}
//Trace verification results
private function verificationComplete(event:Event):void
var signature:XMLSignatureValidator = event.target as XMLSignatureValidator;
trace("Signature status: " + signature.validityStatus + "\n");
trace(" Digest status: " + signature.digestStatus + "\n");
trace(" Identity status: " + signature.identityStatus + "\n");
trace(" Reference status: " + signature.referencesStatus + "\n");
}
private function verificationError(event:ErrorEvent):void
{
trace("Verification error.\n" + event.text);
}
XML 署名の検証プロセス
XMLSignatureValidator の
verify()
メソッドを呼び出すと、AIR では次の手順を実行します。
-
署名証明書の公開キーを使用して、署名の暗号化の整合性をランタイムにより検証します。
-
XMLSignatureValidator オブジェクトの現在の設定に基づいて、証明書の暗号化の整合性、ID および信頼性をランタイムにより確認します。
署名証明書の信頼性は、検証プロセスの完全性を確保するために重要です。署名の検証は適切に定義された暗号化プロセスを使用して行われますが、署名証明書の信頼性はアルゴリズムでは判断できません。
一般に、証明書の信頼性を確認するには、次の 3 つの方法があります。
-
証明機関とオペレーティングシステムの信頼ストアを信頼する。
-
署名者から直接、証明書、証明書の信頼アンカーとして機能する別の証明書または証明書を確実に識別できる情報(公開キーなど)を入手する。
-
アプリケーションのエンドユーザーに、証明書を信頼するかどうかを確認する。このような照会は、自己署名入り証明書では無効です。自己署名入り証明書の識別情報は、本来信頼できないものだからです。
-
署名されたデータの暗号化の整合性をランタイムにより検証します。
署名されたデータは、IURIDereferencer の実装を利用して検証されます。署名ドキュメント内の各参照に対して、IURIDereferencer の実装の
dereference()
メソッドが呼び出されます。
dereference()
メソッドから返されたデータは、参照のダイジェストの計算に使用されます。このダイジェスト値は、署名ドキュメントに記録されているダイジェストと比較されます。ダイジェストが一致する場合、データは署名後に変更されていません。
XML 署名の検証結果を信頼する際の重要な注意事項の 1 つは、署名された対象のみが安全であるということです。例えば、パッケージ内のファイルを一覧表示する署名されたマニフェストがあるとします。XMLSignatureValidator がこの署名を検証するときは、マニフェスト自体が変更されたかどうかをチェックするだけです。ファイル内のデータは署名されていないので、マニフェストで参照されているファイルが変更または削除されても、署名は有効なままです。
注意:
このようなマニフェスト内のファイルを検証するには、(マニフェストで使用されているのと同じハッシュアルゴリズムを使用して)ファイルデータのダイジェストを計算し、署名されたマニフェストに格納されているダイジェストと計算結果を比較します。場合によっては、他のファイルの存在もチェックする必要があります。
検証結果の解釈
検証結果は、XMLSignatureValidator オブジェクトのステータスプロパティで報告されます。これらのプロパティは、検証オブジェクトが
complete
イベントを送出した後に読み取ることができます。ステータスプロパティには、
validityStatus
、
digestStatus
、
identityStatus
および
referencesStatus
の 4 つがあります。
validityStatus プロパティ
validityStatus
プロパティは、署名の全体的な有効性を報告します。
validityStatus
は他の 3 つのステータスプロパティの状態に依存します。値は次のうちのいずれかです。
-
valid
—
digestStatus
、
identityStatus
および
referencesStatus
がすべて
valid
の場合。
-
invalid
— 個々のステータスプロパティのいずれかが
invalid
の場合。
-
unknown
— 個々のステータスプロパティのうち 1 つ以上が
unknown
であり、かつ、1 つのステータスも
invalid
ではない場合。
digestStatus プロパティ
digestStatus
プロパティは、メッセージダイジェストの暗号化の検証結果を報告します。
digestStatus
プロパティの値は、次のうちのいずれかです。
-
valid
— 署名ドキュメント自体が署名後に変更されていない場合。
-
invalid
— 署名ドキュメントが改変されている場合または正しい形式でない場合。
-
unknown
—
verify()
メソッドが正常に実行されなかった場合。
identityStatus プロパティ
identityStatus
プロパティは、署名証明書のステータスを報告します。このプロパティの値は、次のような要因に依存します。
identityStatus
プロパティの値は、次のうちのいずれかです。
-
valid
— 署名証明書が有効と見なされるためには、次の条件を満たしている必要があります。
-
署名証明書が変更されていない。
-
署名証明書は、期限切れのものや失効したものであってはなりません。ただし、署名内に有効なタイムスタンプが存在する場合を除きます。署名がタイムスタンプ付きであり、そのドキュメントが署名された時点で証明書が有効であった場合は、証明書が有効であるものと見なされます(タイムスタンプに署名するときタイムスタンプサービスにより使用された証明書は、ユーザーのコンピューター上の信頼できるルート証明書とチェーンされている必要があります)。
-
署名証明書が信頼されている。証明書が信頼されるのは、証明書がシステムの信頼ストアにあるか、システムの信頼ストアにある別の証明書にチェーン化されていて、
useSystemTrustStore
プロパティが true に設定されている場合です。XMLSignatureValidator オブジェクトの
addCertificate()
メソッドを使用して、証明書を信頼するように指定することもできます。
-
証明書が実際の署名証明書である。
-
invalid
— 証明書が期限切れまたは失効していて署名時の有効性を証明するタイムスタンプがないか、証明書が変更されています。
-
unknown
— 証明書は無効ではないが、信頼できません。例えば、自己署名入り証明書は、明示的に信頼されない限り、
unknown
として報告されます。
identityStatus
が
unknown
として報告される他の例としては、
verify()
メソッドが正常に実行されなかった場合や、署名ダイジェストが無効であるために ID がチェックされなかった場合が挙げられます。
referencesStatus プロパティ
referencesStatus
プロパティは、署名の SignedData エレメントに含まれる参照の暗号化の整合性を報告します。
-
valid
— 署名内の各参照について計算されたダイジェストが、XML 署名に記録された対応するダイジェストに一致する場合。
valid
ステータスは、署名されたデータが変更されていないことを示します。
-
invalid
— 計算されたいずれかのダイジェストが、署名内の対応するダイジェストに一致しない場合。
-
unknown
— 参照のダイジェストがチェックされなかった場合。署名のダイジェスト全体が
invalid
の場合や、署名証明書が無効である場合、参照はチェックされません。
identityStatus
が
unknown
の場合、参照がチェックされるのは、
referencesValidationSetting
が
validOrUnknown
の場合のみです。
|
|
|