PdfStamper
iTextが通常モードでドキュメントを操作する場合、既存のPDFオブジェクトを再配置できます(多くの場合、再配置します)。これは明らかに、既存の統合された署名のハッシュ値を壊します。さらに、署名する必要のあるバイト範囲を変更します。これはおそらくあなたの問題です。
iTextが追加モードでドキュメントを操作する場合PdfStamper
、PDFはそのままで、追加と変更のみを追加します。これは一般に、統合された署名が壊れないようにする方法ですが、一般的なPDFよりも署名の埋め込みに関する規則が厳しいため、この方法で署名の内容を変更することはできません。したがって、追加モードに切り替えても問題は解決しません。
したがって、iTextには、PDFを変更せずに署名を挿入する明示的なメソッドがあります。
MakeSignature.signDeferred(PdfReader reader,
String fieldName,
OutputStream outs,
ExternalSignatureContainer externalSignatureContainer)
throws DocumentException, IOException, GeneralSecurityException
その名前は、このメソッドが元々、遅延署名のユースケースを対象としているという事実に由来しています。つまり、最初に署名用のPDFを準備します(つまり、バイト範囲をハッシュするために必要なすべての辞書とその他の必要な構造を追加します。署名コンテナは最終的に注入されます)、ハッシュ値を計算し、準備されたPDFをローカルに保存しながら、それを他のサービスに送信します。他のサービスが署名を返すとすぐに、準備されたPDFが検索され、取得された署名がこのメソッドを使用して挿入されます。
ユースケースとの唯一の違いは、ギャップにすでに署名があることです。ただし、その署名は、を使用すると更新された署名によって上書きされますsignDeferred
。
以上のことをすべて述べた上で、署名されていない属性にocsp応答を追加した後、AdobeReaderがこれらの情報を検証に使用することを期待している場合は驚かれるかもしれません。ISO-32000-1に準拠した統合PDF署名のコンテキストでは、セクション12.8.3.3 PKCS#7署名(ISO 32000で使用)、
PKCS#7オブジェクトには、署名された属性として[...]失効情報が含まれている必要があります(PDF 1.6):この属性には、署名者の証明書とその発行者の証明書の失効チェックを実行するために必要なすべての失効情報が含まれる場合があります。失効情報は署名された属性であるため、デジタル署名を計算する前に取得する必要があります。つまり、署名者が使用するソフトウェアは、認証パスと関連する失効情報を作成できる必要があります。要素の1つを取得できない場合(たとえば、接続が不可能な場合)、この属性を持つ署名はできません。