一言で言えば、間違ったデータにタイムスタンプを付けています。回答の下部を参照してください。
あなたの署名と Adobe の署名の主な違い:
Adobe の署名には、署名された失効情報属性が含まれています。この属性には、実際の失効情報は含まれません。
この属性はオプションであるため、ここでは関係ありません。
署名には、署名された署名時間属性が含まれています。
タイムスタンプも埋め込まれているので、署名時間は必要ありませんが、禁止されているわけでもありません。
あなたの署名の signatureAlgorithm 値は 1.2.840.113549.1.1.1、つまりRSA 暗号化ですが、Adobe の署名は 1.2.840.113549.1.1.11、つまりsha256WithRSAEncryption です。
ここでは、Adobe の選択の方が断然優れていますが、Adobe Reader は署名の欠陥を無視しているようです。
署名では、タイム スタンプは PDF ドキュメントのハッシュをスタンプします。つまり、署名の署名された messageDigest 属性と同じですが、Adobe の署名では、タイム スタンプは別のものをスタンプします。
バン。これが問題です。確かに、あなたは最初の質問でそれを言っていましたが、それは私の目に留まりませんでした:
CryptHashMessage 関数 (SHA256) を使用して、pdf データのダイジェストを作成します。
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.*