2017-11-10 61 views
0

iText7でpdf文書で複数の署名を行いたいのですが、問題は一度署名しても問題ありません。私が2回署名した場合、最初の署名は無効です。iText7複数の署名

enter image description here

enter image description here

unsigned PDF

signed PDF

を、ここに私のコードです:それはこのようになります

@Test 
public void testMutiSign() { 

    iTextSignerUtil1.SignMultPDF(getBytes(unsignedPath), destPath1); 

    iTextSignerUtil2.SignMultPDF(getBytes(destPath1), destPath2); 

} 


IExternalSignatureContainer externalP7DetachSignatureContainer = new IExternalSignatureContainer() { 
    @Override 
    public byte[] sign(InputStream data) throws GeneralSecurityException { 


     //byte[] hashData = HashUtil.hash(data , "SHA256"); 

     byte signData = null; 
     signData = signUtil.signP7DetachData(data); 

     return signData; 

    } 


    @Override 
    public void modifySigningDictionary(PdfDictionary signDic) { 
     signDic.put(PdfName.Filter, PdfName.Adobe_PPKLite); 
     signDic.put(PdfName.SubFilter, PdfName.Adbe_pkcs7_detached); 
    } 
}; 


public void SignMultPDF(byte[] pdfFile , String destPath , String name , String fname , String value){ 

    boolean success = false; 

    int estimatedSize = 300000; 

    while (!success) { 
     try { 

      PdfReader pdfReader = new PdfReader(new ByteArrayInputStream(pdfFile)); 
      PdfSigner pdfSigner = new PdfSigner(pdfReader, new FileOutputStream(destPath), true); 

      pdfSigner.signExternalContainer(externalP7DetachSignatureContainer, estimatedSize); 

      success = true; 

     } catch (IOException e) { 
      e.printStackTrace(); 
      estimatedSize += 1000; 
     } catch (GeneralSecurityException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

上記はすべて私のサンプルタラですe。

もう1つの質問ですが、署名フィールドを作成するのに失敗しましたか?

+0

Hmmm、hmmm、この動作は追加モードなしの署名と一致しますが、 'PdfSigner'は正しく構築されているように見えます。外部の署名用のコンテナで何か問題が起きている可能性がありますか?実装を分かち合えますか? –

+0

検証の詳細を共有することはできますか?標準のETSI TS 102 853に従って署名を検証しようとしましたか? (そのためのオンラインツールがいくつかあります。Google "dss signature validation") – veebee

+0

また、分析のために2回署名したPDFを共有するだけです。 – mkl

答えて

2

、この問題の原因は、original fileの癖である:それは、情報辞書として及びアウトライン辞書としても使用しています空の間接的な辞書を持っています。

PDFを操作するたびにiTextのは、特ににModDateは、各時間を変更する可能性があり、その情報辞書を更新します。

したがって、各署名中情報辞書が変更された渡し、辞書オブジェクトが共有されるので、アウトライン辞書です。ただし、すでに署名されたPDFのアウトラインを変更することはできません。したがって、第2の署名の作成中にの情報(およびのアウトライン)の変更は許可されず、最初の署名が無効になります。

This fileoriginal fileとほぼ同じですが、唯一の違いは、単に変化に必要なI、ファイルで現在使用されていない空の間接的な辞書があったとして(それは情報概要に別の空の辞書を使用していることですの情報または概要この未使用のオブジェクトに)。このファイルに2度署名すると、Adobeはもう苦情を申し立てません。


これはiTextまたはPDFのバグですか? 情報辞書を変更するとき、iTextは新しい間接オブジェクト番号を使うべきだと思う。そのような辞書の重複使用は一般にPDFでは禁止されていないからだ。しかし、このような間接的なオブジェクトの使用を重複して使用するPDFは、本当に問題を求めています。だから、私はこの質問が、iTextの問題とPDFの問題の両方を光の中にもたらすと思う。

+0

ここで私が見つけたitext7の例をいくつか示します:[SignatureWorkflow](http://gitlab.itextsupport.com/itext7/samples/blob/develop/publications/signatures/src/test/java/com/itextpdf/samples/signatures/ chapter02/C2_11_SignatureWorkflow.java)と[LockFields](http://gitlab.itextsupport.com/itext7/samples/blob/develop/publications/signatures/src/test/java/com/itextpdf/samples/signatures/chapter02/C2_12_LockFields .java)。直接署名するのではなく、署名フィールドを最初に自分で作成する必要があるようですね。だから私はいくつかのオーバーライドを行うには、フォームを作成し、記入して、それは動作します。 – JDNew

+0

しかし、問題はそれがpdfのテーブルを作成することです、私はこのテーブルを表示する必要はないと思う。 – JDNew

+0

*「署名フィールドを最初に自分で作成する必要があるようですが、直接署名するのではなく、正しいのですか?」 - 間違っています。特定のワークフローを実施する場合、特に各署名の後に事前に定義された一連の許可された変更のみを許可する場合に必要です。当面の状況では、問題は上記のあなたの非常にpdf addに関連しています。操作したバージョンでテストするだけで、自分の答えでも共有できます。 – mkl

関連する問題