2017-11-10 26 views
0

iText7이 포함 된 pdf 문서에서 여러 서명을 수행하려고하지만 한 번 서명하면 문제가됩니다. 두 번 서명하면 첫 번째 서명이 유효하지 않습니다.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.

그리고 또 하나의 질문은 서명 필드를 만드는 데 실패 했습니까?

+0

Hmmm, hmmm이 동작은 추가 모드가없는 서명과 일치하지만 'PdfSigner'가 올바르게 구성되어있는 것으로 보입니다. 외부 서명 용기에서 뭔가 잘못하고있는 것 같습니까? 그것의 구현을 공유 할 수 있습니까? –

+0

유효성 확인 세부 정보를 공유 할 수도 있습니까? 표준 ETSI TS 102 853에 따라 서명을 검증하려 했습니까? (이를위한 몇 가지 온라인 도구가 있습니다.Google "dss signature validation") – veebee

+0

또는 단순히 분석을 위해 서명 된 두 번 PDF를 공유하십시오. – mkl

답변

2

이 문제의 원인은 original file의 특질이다 : 그것은 모두 정보 등의 사전 및 개요 사전으로 사용하는 빈 간접 사전을 가지고 있습니다.

ModDate 각 시간을 변경 가능성이 특히 iText를가 정보 사전을 업데이트하는 PDF를 조작 할 때마다.

따라서, 각각의 서명시 정보 사전 변경 전달한 사전 오브젝트가 공유 될 때, 그래서 윤곽선 사전이다. 그러나 외곽선 인을 이미 서명 된 PDF로 변경하는 것은 허용되지 않습니다. 따라서 정보 (및 개요)은 두 번째 서명을 만드는 동안 변경 될 수 없으며 첫 번째 서명을 무효화합니다.

This file

original file와 거의 동일, 유일한 차이점은 에 대한 정보하고 파일에서 현재 사용되지 않는 빈 간접 사전 거기로 이 개요 (내가 단지 변화에 필요한 다른 빈 사전을 사용한다는 것입니다 정보 또는 개요이 사용되지 않는 개체에). 이 파일에 두 번 서명하면 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 .자바). 직접 서명하는 대신 서명 필드를 먼저 만들어야하는 것 같습니다. 맞습니까? 그래서 나는 이것에 따라 약간의 재정의 (override)를하고, 폼을 작성하고 채 웁니다. – JDNew

+0

하지만 문제는 pdf에서 테이블을 생성 할 것이므로이 테이블을 표시 할 필요가 없다고 생각합니다. – JDNew

+0

* "직접 서명하는 대신 서명란을 먼저 만들어야하는 것 같습니다."* - 잘못되었습니다. 특정 작업 흐름을 적용하기 위해서, 특히 각 서명 이후에 미리 정의 된 허용 된 변경 사항 집합 만 허용하려면 이렇게해야합니다. 당면 상황에서 문제는 위에서 설명한 귀하의 매우 pdf 추가와 관련이 있습니다. 조작 된 버전으로 테스트하기 만하면됩니다. – mkl