Java XML デジタル署名 API 仕様 (JSR 105)

目次

はじめに

このドキュメントでは、Java XML デジタル署名 API 仕様 (JSR 105) について説明します。この JSR の目的は、XML 署名を生成および検証するための標準の Java API を定義することです。

この仕様が完成すると、この API の機能について説明するリファレンス実装が作成されることになり、この仕様のオペレーションの定義が提供されます。この仕様の実装に対応しているかどうかを確認するための Technology Compatibility Kit (TCK) も使用可能になります。Java Community Process 2.1 に従ってこれらが必要になります。

JSR 105 API は、次の 2 種類のユーザーをターゲットにしています。

謝辞

JSR 105 エキスパートグループ: また、次のメンバーにも感謝を捧げます。Sun Microsystems の Valerie Peng、Vincent Ryan、Sharon Liu、Chok Poh、K. Venugopal Rao.、Paul Rank、Alexey Gavrilov、Bill Situ、Eric Jendrock、Andrew Fan、Manveen Kaur、Tom Amiro、Michael Mi、Dmitri Silaev、Roman Makarchuk、Vanitha Venkatraman, Arkadiy Sutchilin, Scott Fordin、Apache の Vishal Mahajan、IAIK の Martin Centner。

要件

このドキュメントのキーワード「MUST」、「MUST NOT」、「REQUIRED」、「SHALL」、「SHALL NOT」、「SHOULD」、「SHOULD NOT」、「RECOMMENDED」、「MAY」、および「OPTIONAL」は、RFC 2119 に説明されているとおりに解釈されます。
  1. W3C Recommendation, XML-Signature Syntax and Processing
    • API を使用して、プログラマは W3C 勧告で規定されている SHOULD および MUST のすべての要件を満たす XML 署名を生成および検証できる必要があります。
    • API を使用して、W3C 勧告で規定されている SHOULD および MUST のすべての要件を満たす API の実装を作成できる必要があります。
  2. 実装は、W3C Recommendation, XML-Signature XPath Filter Transform 2.0 をサポートする必要があります。
  3. 実装は、W3C Recommendation, Exclusive XML Canonicalization Version 1.0 をサポートする必要があります。
  4. DOM に依存しない API。API は、DOM などの特定の XML 表現に依存していない必要があります。DOM、JDOMdom4j などの異なる XML 処理やメカニズム表現に対して API 実装を作成できる必要があります。
  5. 拡張可能なプロバイダベースの API。サードパーティーが、暗号化アルゴリズムや変換アルゴリズムの管理や作成、URI の間接参照、および XML のオブジェクトの整列化を行う実装を作成およびプラグインすることができる必要があります。
  6. デフォルトの XML メカニズムタイプ DOM のサポート。実装は、デフォルトのメカニズムタイプ DOM を最低限サポートする必要があります。これにより、JSR 105 のすべての実装で最低レベルの機能性が保証されます。実装は、ほかのメカニズムタイプもサポートできます。
  7. デフォルトの XML メカニズムタイプ DOM の相互運用性。API は、DOM 実装を使用するアプリケーションで移植性および相互運用性を保証する必要があります。
  8. J2SE 要件。このテクノロジの実装は J2SE 1.2 以降をサポートできますが、最低限 J2SE のバージョン 1.4 をサポートする必要があります。

API 依存

目標にしない事項

  1. 非 DOM 実装のサポート。API では非 DOM 実装を作成できる必要がありますが、DOM 以外の実装間での相互運用性を保証することは最初のバージョンの範囲外です。追加の標準サービスプロバイダタイプが今後追加されたり、JSR 105 の保守バージョンで必要な API の拡張機能が検討される可能性があります。
  2. 高レベルの API のサポート。プログラマは、JSR 105 API に基づいて構築される高レベルの API を設計して、低レベルの詳細を非表示にしたり、共通のユースケースに対処したり、プロファイリングの制限を適用できます。ただし、これらの要件をサポートすることは最初のバージョンの範囲外です。高レベルの API は、JSR 105 の保守リリースで考慮される可能性があります。
  3. ユーザーがプラグイン可能なアルゴリズム (javax.xml.crypto.dsig.TransformService クラスでサポートされている変換アルゴリズムおよび正規化アルゴリズム以外) のサポート。開発者が完全な JSR 105 実装を作成せずに独自の XML 署名アルゴリズムの実装をプラグインできるようにすることは、有用なことだと考えられますが、JSR 105 のこのリリースでは必要ありません。Java SE の後続リリースでは、ベースとなる JCA/JCE を拡張して、XML セキュリティーアルゴリズム、パラメータ、鍵情報の登録、解析、および処理のサポートを追加するソリューションを検討しています。

パッケージの概要

JSR 105 API は、次の 6 つのパッケージで構成されています。 javax.xml.crypto パッケージには、XML 署名の生成や XML データの暗号化など、XML 暗号化操作を行う場合に使用する共通クラスが含まれています。このパッケージ内の主要なクラスには次の 2 つがあります。KeySelector クラスを使用すると、開発者は、KeyInfo オブジェクトに含まれている情報を使用して鍵を検出して任意に検証する実装を提供できます。URIDereferencer クラスを使用すると、開発者は、独自の URI 間接参照実装を作成および指定できます。

javax.xml.crypto.dsig パッケージには、W3C XML デジタル署名仕様で定義されているコア要素を表すインタフェースが含まれています。もっとも重要なのは XMLSignature クラスです。このクラスを使用すると、XML デジタル署名の署名および検証を行うことができます。ほとんどの XML 署名または要素は、対応するインタフェースによって表されます。ただし、KeyInfo 構造は独自のパッケージに含まれているため、次の段落で説明します。これらのインタフェースには、SignedInfoCanonicalizationMethodSignatureMethodReferenceTransformDigestMethodXMLObjectManifestSignatureProperty、および SignatureProperties があります。XMLSignatureFactory クラスは、これらのインタフェースを実装するオブジェクトを作成する場合に使用する抽象ファクトリです。

javax.xml.crypto.dsig.keyinfo パッケージには、W3C XML デジタル署名勧告で定義されているほとんどの KeyInfo 構造を表すインタフェースが含まれています。この構造には、KeyInfoKeyNameKeyValueX509DataX509IssuerSerialRetrievalMethod、および PGPData があります。KeyInfoFactory クラスは、これらのインタフェースを実装するオブジェクトを作成する場合に使用する抽象ファクトリです。

javax.xml.crypto.dsig.spec パッケージには、ダイジェスト、署名、変換、または XML 署名の処理で使用される正規化アルゴリズム用の入力パラメータを表すインタフェースおよびクラスが含まれています。

最後に、javax.xml.crypto.dom および javax.xml.crypto.dsig.dom パッケージには、javax.xml.crypto および javax.xml.crypto.dsig パッケージ用の DOM 固有のクラスが含まれています。DOM ベースの XMLSignatureFactory または KeyInfoFactory 実装を作成または使用する開発者およびユーザーのみが、これらのパッケージを直接使用する必要があります。

サービスプロバイダ

JSR 105 暗号化サービスは、XMLSignatureFactory および KeyInfoFactory 抽象クラスの固定実装であり、XML 署名や KeyInfo 構造を解析、生成、および検証するオブジェクトやアルゴリズムを作成します。XMLSignatureFactory の固定実装は、XML 署名に関する W3C 勧告に規定されているように、必要なそれぞれのアルゴリズムをサポートしている必要があります。この固定実装は、W3C 勧告やほかの仕様に規定されているように、ほかのアルゴリズムをサポートできます。

JSR 105 は、JCA プロバイダモデルを使用して XMLSignatureFactory および KeyInfoFactory 実装の登録とロードを行います。

固定実装 XMLSignatureFactory または KeyInfoFactory はそれぞれ、XML 署名や KeyInfo 構造を解析および生成するときに実装によって内部で使用される XML 処理メカニズムを識別する特定の XML メカニズムタイプをサポートしています。この JSR は標準タイプ DOM をサポートしています。新しい標準タイプ (JDOM など) のサポートは、今後追加される可能性があります。

JSR 105 実装は、java.security.Signaturejava.security.MessageDigest などのベースとなる JCA エンジンクラスを使用して暗号化操作を行う必要があります。

XMLSignatureFactory および KeyInfoFactory クラス以外に、JSR 105 は、変換および正規化アルゴリズム用のサービスプロバイダインタフェースもサポートしています。TransformService クラスを使用すると、特定の XML メカニズムタイプ用の固有の変換または正規化アルゴリズムの実装を開発およびプラグインすることができます。TransformService クラスは、実装を登録およびロードするときに標準 JCA プロバイダモデルを使用します。各 JSR 105 実装は TransformService クラスを使用して、生成または検証している XML 署名で変換アルゴリズムおよび正規化アルゴリズムをサポートするプロバイダを見つける必要があります。

DOM メカニズムの要件

相互運用性の問題を最小限にするために、DOM ベースの XMLSignatureFactoryKeyInfoFactory、または TransformService を実装する場合は、次の要件に従う必要があります。
  1. XMLSignatureFactoryunmarshalXMLSignature メソッドは DOMValidateContext 型をサポートする必要があります。型が DOMValidateContext の場合は Signature 型の要素を含む必要があります。また、unmarshalXMLSignature メソッドは渡される DOMValidateContext の ID/要素マッピングを生成できます。
  2. XMLSignatureFactory によって生成される XMLSignaturesign メソッドは DOMSignContext 型をサポートし、validate メソッドは DOMValidateContext 型をサポートする必要があります。この要件は、SignatureValuevalidate メソッドおよび Referencevalidate メソッドにも当てはまります。
  3. 実装は、アプリケーションが拡張可能なコンテンツ (任意の要素または混合コンテンツ) を指定するためのメカニズムとして DOMStructure をサポートする必要があります。
  4. ユーザー指定の URIDereferencerdereference メソッドが NodeSetData オブジェクトを返す場合、iterator メソッドは型 org.w3c.dom.Node のオブジェクトの繰り返しを返す必要があります。
  5. ユーザー指定の URIDereferencerdereference メソッドに渡された URIReference オブジェクトは型 DOMURIReference であり、XMLCryptoContext オブジェクトは DOMCryptoContext を実装する必要があります。
  6. 直前の 2 つの要件は、XMLSignatureFactory および KeyInfoFactorygetURIDereferencer メソッドによって返される URIDereferencer にも当てはまります。
  7. KeyInfoFactoryunmarshalKeyInfo メソッドは DOMStructure 型をサポートする必要があります。型が DOMStructure の場合は KeyInfo 型の要素を含む必要があります。
  8. Transformtransform メソッドは DOMCryptoContext コンテキストパラメータ型をサポートする必要があります。
  9. XMLSignatureFactorynewtransform および newCanonicalizationMethod メソッドは DOMStructure パラメータ型をサポートする必要があります。
  10. TransformServiceinit および marshalParams メソッドは DOMStructure および DOMCryptoContext 型をサポートする必要があります。
  11. XMLSignatureFactoryunmarshalXMLSignature メソッドは DOMStructure 型をサポートする必要があります。型が DOMStructure の場合は Signature 型の要素を含む必要があります。
  12. KeyInfomarshal メソッドは DOMStructure および DOMCryptoContext パラメータ型をサポートする必要があります。
DOM 実装は、相互運用性に影響しない場合、DOM 以外の XML 解析 API を内部的に使用できます。たとえば、XMLSignatureFactory の DOM 実装は、内部的に SAX パーサーを使用してデータを正規化することができます。

オープン API の問題

オープン API の問題は、次のとおりです。
  1. 外部 XML ドキュメント参照の ID 属性の登録がサポートされていません。
    次の参照について検討してみます。
    
      <Reference URI="document.xml">
        <Transforms>
          <Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
            <XPath>id("foo")</XPath>
          </Transform>
        </Transforms>
      </Reference>
          
    
    外部ドキュメントの間接参照によってオクテットストリームが生成され、それが JSR 105 実装によって NodeSet に変換されています。ただし、API では外部ドキュメントの ID 属性を登録するためのメカニズムが提供されていないため、XPath 変換実装は「foo」 ID を識別できない可能性があります。

プログラミング例

次の例 1 - 3 では、JSR 105 API を使用してさまざまなタイプの単純な XML デジタル署名を生成する方法について説明します。例 1 では、DSA 署名アルゴリズムを使用して分離署名を生成する方法について説明します。例 2 では、エンベロープされた署名を生成する方法について説明します。例 3 では、エンベロープする署名を生成する方法について説明します。例 4 では、XML 署名を検証する方法について説明します。
  1. 分離された XML デジタル署名の生成
  2. エンベロープされた XML デジタル署名の生成
  3. エンベロープする XML デジタル署名の生成
  4. XML デジタル署名の検証

Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.