XML 署名について

Adobe AIR 1.5 およびそれ以降

XML 署名は、XML シンタックスで表された電子署名です。 XML 署名のデータを使用して、署名された情報が署名後に変更されていないかどうかを検証できます。また、署名証明書が信頼できる証明機関から発行されている場合は、公開キーインフラストラクチャを使用して署名者の ID を検証できます。

XML 署名は、バイナリまたは XML 形式のあらゆる種類のデジタルデータに適用できます。XML 署名は、通常、次のような目的に使用されます。

  • 外部リソースやダウンロードされたリソースが変更されているかどうかのチェック

  • メッセージが既知のソースから発信されたかどうかの検証

  • アプリケーションのライセンスやサブスクリプション権限の検証

サポートされる XML 署名のシンタックス

AIR では、W3C 勧告「XML Signature Syntax and Processing」に含まれる次のエレメントをサポートしています。

  • すべてのコア署名シンタックスエレメント(W3C 勧告ドキュメントのセクション 4)。ただし、KeyInfo エレメントは完全にはサポートされていません。

  • KeyInfo エレメント。X509Data エレメントのみを含んでいる必要があります。

  • X509Data エレメント。X509Certificate エレメントのみを含んでいる必要があります。

  • SHA256 ダイジェストメソッド。

  • RSA-SHA1(PKCS1)署名アルゴリズム。

  • 「コメントのない Canonical XML」正規化方法と変換。

  • enveloped 署名の変換。

  • タイムスタンプ

次のドキュメントに、一般的な XML 署名を示します(例を単純にするために、ほとんどの暗号化データを除いてあります)。

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
    <SignedInfo> 
        <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> 
        <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 
        <Reference URI="URI_to_signed_data"> 
            <Transforms> 
                <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>            </Transforms> 
            <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> 
            <DigestValue>uoo...vY=</DigestValue> 
        </Reference> 
    </SignedInfo> 
    <SignatureValue>Ked...w==</SignatureValue> 
    <KeyInfo> 
        <X509Data> 
            <X509Certificate>i7d...w==</X509Certificate> 
        </X509Data> 
    </KeyInfo> 
</Signature>

署名の主要なエレメントは次のとおりです。

  • SignedInfo - 署名対象データへの参照と、署名時に計算されたダイジェスト値が含まれます。 署名対象データは、XML 署名と同じドキュメントに含めることも、外部に配置することもできます。

  • SignatureValue - 署名者の秘密キーで暗号化された SignedInfo エレメントのダイジェストが含まれます。

  • KeyInfo - 署名証明書と、信頼チェーンを作成するために必要なその他の証明書が含まれます。KeyInfo エレメントは技術的には省略可能ですが、このエレメントが含まれていない場合、AIR では署名を検証できません。

XML 署名には、大きく分けて次の 3 つの種類があります。

  • enveloped - 署名が、署名対象の XML データ内に挿入されています。

  • enveloping - 署名対象の XML データが、Signature エレメント内の Object エレメントに内包されています。

  • detached - 署名対象のデータが、XML 署名の外部にあります。署名対象のデータを外部ファイルに置くこともできます。また、署名と同じ XML ドキュメント内に、親エレメントや子エレメント以外として含めることもできます。

XML 署名では、URI を使用して署名対象データを参照します。署名側のアプリケーションと検証側のアプリケーションは、同じ規則を使用してこれらの URI を解決する必要があります。XMLSignatureValidator クラスを使用するときは、IURIDereferencer インターフェイスの実装を用意する必要があります。この実装は URI を解決し、署名されたデータを ByteArray オブジェクトとして返します。署名のダイジェストを生成したのと同じアルゴリズムを使用して、返された ByteArray オブジェクトのダイジェストが生成されます。

証明書と信頼

証明書は公開キーと識別情報で構成され、場合によっては発行側の証明機関に属する 1 つ以上の証明書が含まれています。

証明書の信頼性を確認する方法は 2 つあります。物理メディアや SSL トランザクションなどの安全な電子通信を利用して署名者から証明書を直接入手することにより、信頼性を確認できます。また、証明機関を信頼することによって署名証明書の信頼性を確認することもできます。

証明機関を信頼するには、署名証明書の署名が検証されるコンピューターで信頼されている機関から発行されている必要があります。ほとんどのオペレーティングシステムでは、システムの信頼ストアに、多くの証明機関のルート証明書があらかじめ組み込まれています。ユーザーがストアの証明書の追加や削除を行うこともできます。

証明書が信頼できる証明機関から発行されていても、証明書の所有者を信頼できるかどうかを確認する必要があります。多くの場合、この判断はエンドユーザーに委ねられます。 例えば、AIR アプリケーションのインストールでは、アプリケーションをインストールするかどうかをユーザーに確認する際に、発行者の証明書の識別情報が表示されます。また、公開キーやその他の証明書情報を、許容されるキーのリストと比較する必要がある場合もあります(このリストは、それ自体が改ざんされないように、リスト自身による署名や AIR の暗号化されたローカルストアへの格納によって保護される必要があります)。

注意: 署名が「自己署名」である場合などに、単独での検証を行わずに署名証明書を信頼することもできますが、その場合、署名を検証してもあまり多くの保証は得られません。 署名の作成者がわからない場合、署名が改ざんされていないという保証にほとんど意味はありません。署名は、有効に署名された偽造である可能性があります。

証明書の期限切れと失効

すべての証明書には期限があります。また、証明書に関連付けられた秘密キーが改ざんされたり盗まれたりした場合などに、発行側の証明機関によって証明書が取り消されることもあります。 署名が期限切れの証明書や失効した証明書で署名されている場合、署名にタイムスタンプが含まれていない限り、その署名は無効として報告されます。タイムスタンプが含まれている場合は、証明書が署名時に有効である限り、XMLSignatureValidator クラスは署名を有効と見なします。

タイムスタンプはタイムスタンプサービスから送信される署名された電子メッセージで、特定の日時にデータが署名されたことを証明します。タイムスタンプはタイムスタンプ機関から発行され、タイムスタンプ機関自身の証明書で署名されています。タイムスタンプが有効と見なされるには、タイムスタンプに組み込まれているタイムスタンプ機関の証明書が、現在のマシンで信頼されている必要があります。XMLSignatureValidator には、タイムスタンプの検証に使用する別の証明書を指定するための API はありません。