4

良い一日、

署名がタイムスタンプであることがアドビから報告されるように、タイムスタンプ情報を PDF 署名に埋め込もうとしています。現在、私が達成したのは、アドビが「署名には埋め込まれたタイムスタンプが含まれていますが、検証できませんでした」と報告し、日付/時刻のプロパティを表示すると、「タイムスタンプ機関」が利用できず、「ショー証明書」はグレー表示されています。

明らかに、私は PKCS#7 メッセージを作成する際に何か間違ったことをしています。しかし、私は今何を知りません。署名にタイムスタンプを付けるために必要な手順を説明して、誰か助けてくれませんか? または、問題を見つけるのに役立つツールを提案してください。

Crypto API を使用しています。私が現在従う手順は次のとおりです。

  1. CryptHashMessage関数 (SHA256)を使用して、pdf データのダイジェストを作成します。
  2. CryptRetrieveTimeStamp関数を使用して、このダイジェストを TSA に送信します。*TIMESTAMP_DONT_HASH_DATA* フラグを設定して、ダイジェストが再度ハッシュされないようにしました。
  3. TSA からの応答は *CRYPT_SIGN_MESSAGE_PARA* 構造に非認証属性として追加され、署名時刻は認証済み属性として追加されます。
  4. 次に、CryptSignMessage関数を使用して、上記の構造を使用する元のデータに署名します。

Adobe が署名にタイムスタンプが付けられていることを示すことができるように、データが正しいことを確認するにはどうすればよいですか?

よろしく、マグダ

4

2 に答える 2

7

一言で言えば、間違ったデータにタイムスタンプを付けています。回答の下部を参照してください。

あなたの署名と Adob​​e の署名の主な違い:

  1. Adobe の署名には、署名された失効情報属性が含まれています。この属性には、実際の失効情報は含まれません。

    この属性はオプションであるため、ここでは関係ありません。

  2. 署名には、署名された署名時間属性が含まれています。

    タイムスタンプも埋め込まれているので、署名時間は必要ありませんが、禁止されているわけでもありません。

  3. あなたの署名の signatureAlgorithm 値は 1.2.840.113549.1.1.1、つまりRSA 暗号化ですが、Adobe の署名は 1.2.840.113549.1.1.11、つまりsha256WithRSAEncryption です。

    ここでは、Adobe の選択の方が断然優れていますが、Adobe Reader は署名の欠陥を無視しているようです。

  4. 署名では、タイム スタンプは PDF ドキュメントのハッシュをスタンプします。つまり、署名の署名された messageDigest 属性と同じですが、Adobe の署名では、タイム スタンプは別のものをスタンプします。

    バン。これが問題です。確かに、あなたは最初の質問でそれを言っていましたが、それは私の目に留まりませんでした:

    1. CryptHashMessage 関数 (SHA256) を使用して、pdf データのダイジェストを作成します。

    2. CryptRetrieveTimeStamp 関数を使用して、このダイジェストを TSA に送信します。ダイジェストが再度ハッシュされないように、 TIMESTAMP_DONT_HASH_DATAフラグを設定しました。

    これは間違っています!仕様に従って、タイムスタンプは署名されていない属性として追加されます。

未署名属性としてのタイムスタンプ情報 (PDF 1.6): タイムスタンプ トークンは RFC 3161 に準拠し、RFC 3161 の付録 A で説明されているように計算され、PKCS#7 オブジェクトに埋め込まれます。

( ISO 32000-1のセクション 12.8.3.3.1 )

*And RFC 3161 states:*

TimeStampToken 内の messageImprint フィールドの値は、タイムスタンプされた signedData の SignerInfo 内の署名フィールドの値のハッシュでなければなりません。

( RFC 3161の付録 A )

*Thus, **you are time stamping the wrong hash!** Adobe correctly expects you to time stamp the signature. So you should first create a regular signature, then look up its signature value, hash & time stamp that value, and then add that time stamp to the signature container signer info as unsigned time stamp attribute.*

*Unfortunately I don't know the Windows Crypto API well enough to explain how to do that; I'm more at home in the Java crypto api.*
于 2013-09-12T14:55:15.560 に答える