さて技術的な説明は
前回と
前々回で終わったと考えています。最終回の今回はまず実際のサンプルファイルを見てみましょう。早速ですが以下はXAdES 1.3.2とXAdES 1.4.1/1.4.2でそれぞれ署名したES-A(保管タイムスタンプ付)のサンプルファイルです。弊社の
Le-XAdESのVer1.5ベータ版で作成してあります。
XAdES-A(v1.3.2)
※ XAdES-A(v1.3.2)のATS-1ハッシュ対象
XAdES-A(v1.4.1)
※ XAdES-A(v1.4.1)のATS-1ハッシュ対象
では内容をチェック/説明してみましょう。なおこのサンプルでは検証情報発行の猶予期間は見ておりません。厳密にはエラーになるケースではありますがここでは構造のチェックの為に手軽に作成したと言うことでご理解下さい。また保管タイムスタンプは2重に付与してあります。
まず
XAdES 1.3.2のES-Aファイルを見てみましょう。UnsignedSignatureProperties要素の下を見て行きます。署名タイムスタンプ(SignatureTimeStamp要素)の"Id-STS-1"のTSA証明書に必要となる証明書群と検証情報(CRL)群はEncapsulatedTimeStamp要素のタイムスタンプトークン(RFC3161形式)の中に全て埋め込まれています。SignatureTimeStamp要素のすぐ後にあるCertificateValues要素とRevocationValues要素は全て署名証明書要の証明書群と検証情報(CRL)群となっています。その後に保管タイムスタンプ(ArchiveTimeStamp要素)が"Id-ATS-1"/"Id-ATS-2"と2重に付与されています。"Id-ATS-1"の方は署名タイムスタンプと同様に証明書群と検証情報(CRL)群をタイムスタンプトークン(RFC3161形式)の中に全て埋め込んでいます。これがXAdES 1.3.2における一般的な保管タイムスタンプの追加方法となります。署名タイムスタンプ用の証明書パスとCRL群は埋め込みでは無くCertificateValues要素とRevocationValues要素に加えても構いません。
<SignatureTimeStamp Id="id-STS-1" />
↑ STS-1の証明書パスとCRL群は埋め込み
<CertificateValues /> ← XML署名の証明書パス
<RevocationValues /> ← XML署名のCRL群
<ArchiveTimeStamp Id="id-ATS-1" />
↑ ATS-1の証明書パスとCRL群は埋め込み
<ArchiveTimeStamp Id="id-ATS-2" />
次に
XAdES 1.4.1/1.4.2のES-Aファイルを見てみましょう。UnsignedSignatureProperties要素の下を見て行きます。署名タイムスタンプ(SignatureTimeStamp要素)の"Id-STS-1"のTSA証明書に必要となる証明書群と検証情報(CRL)群はその後にあるTimeStampValidationData要素の下にあるCertificateValues要素とRevocationValues要素の下にあります。TimeStampValidationData要素のすぐ後にあるCertificateValues要素とRevocationValues要素は全て署名証明書要の証明書群と検証情報(CRL)群となっています。これはXAdES 1.3.2と同じですね。その後に保管タイムスタンプ(ArchiveTimeStamp要素)が"Id-ATS-1"/"Id-ATS-2"と2重に付与されていますが、その間に2番目のTimeStampValidationData要素が挟まれています。この2番目のTimeStampValidationData要素の下に最初の保管タイムスタンプ"Id-ATS-1"に関する証明書群と検証情報(CRL)群が格納されています。
<SignatureTimeStamp Id="id-STS-1" />
<TimeStampValidationData URI="#id-STS-1">
<CertificateValues /> ← STS-1の証明書パス
<RevocationValues /> ← STS-1のCRL群
</TimeStampValidationData>
<CertificateValues /> ← XML署名の証明書パス
<RevocationValues /> ← XML署名のCRL群
<ArchiveTimeStamp Id="id-ATS-1" />
<TimeStampValidationData URI="#id-ATS-1">
<CertificateValues /> ← ATS-1の証明書パス
<RevocationValues /> ← ATS-1のCRL群
</TimeStampValidationData>
<ArchiveTimeStamp Id="id-ATS-2" />
同じ事をやっているのですがXAdES 1.3.2の方がシンプルに見えますね。でもXMLとしてはシンプルですがその代わりにバイナリでASN.1/DER(BER)を解いてRFC3161形式のタイムスタンプトークンを扱う必要があります。一方XAdES 1.4.1/1.4.2はXMLとしては複雑に見えますが同じCertificateValues/RevocationValuesの仕組みで証明書とCRLを保管出来ているので一貫性はあります。個人的な感想としてはXAdES 1.4.1/1.4.2の方が仕組みとしてはシンプルで美しく感じています。ただこの辺りは立場やノウハウにより人によって異なるところでしょうね。さてあなたはどう思うでしょうか。
欧州の方では2013年以降はXAdES 1.4.1/1.4.2形式の保管タイムスタンプにする必要があると聞いています。日本ではまだJISプロファイルがXAdES 1.3.2のままで残念ながらXAdES 1.4.1/1.4.2対応のアップデートが遅れています。今年中にJISプロファイルのXAdES 1.4.1/1.4.2対応が出来ると良いのですがどうなりますか。XAdESのJISプロファイルに関しては私も関係すると思いますので頑張ります(^^;
さて以上で全4回に渡ったXAdES 1.4.1/1.4.2のシリーズは終了です。お役に立ちましたでしょうか?と言ってもこの内容が必要や参考になる人は日本国内だとごく僅かな気がしますw ニッチ中のニッチな情報かなと(^^;
XAdES 1.4.1/1.4.2:第1回 概要と名前空間 (2012-04-02)
XAdES 1.4.1/1.4.2:第2回 XAdESv141:TimeStampValidationData (2012-04-03)
XAdES 1.4.1/1.4.2:第3回 XAdESv141:ArchiveTimeStamp (2012-04-05)
XAdES 1.4.1/1.4.2:第4回 サンプルファイル他 (2012-04-06)
長期署名の技術は必要だと思っています。もっと流行ると良いなぁ。では全4回をご覧頂いた方はお疲れ様でした。次回はPAdESとか書けると良いなぁと思ってます。再見!
XAdES署名の例があってとても助かりました。いま、XAdES EN用のRELAX NGスキーマを書いているのですが、この例を検証してみると妥当であると判断されました。
しかし、本家のXSDスキーマのほうはチェックがとても甘く見えますね。xsd:anyを使いまくっているので、なんでも通ってしまいそう。
しかし、本家のXSDスキーマのほうはチェックがとても甘く見えますね。xsd:anyを使いまくっているので、なんでも通ってしまいそう。