2017-09-15 5 views
1

모든 비슷한 질문을했으나 itextsharp 지연 서명이 적용된 사례를 찾을 수 없습니다.디지털 서명 (PKCS # 7 - 지연 서명)/서명이 적용된 이후에 문서가 변경되었거나 손상되었습니다.

기본적으로 내 응용 프로그램은 원격 웹 서비스에 의해 생성 된 PKCS#7 서명을 사용하여 pdf 문서에 서명합니다.

내 응용 프로그램은이 웹 서비스에 원본 문서의 해시 (빈 서명 필드가 추가 된 후 서명 가능한 바이트의 해시)를 보내고 Base64로 인코딩 된 서명 파일을받습니다.

서명란이 비어있는 이전에 생성 된 임시 pdf 파일에이 서명을 삽입합니다.

Adobe Reader에서 문서가 변경되었거나 손상되었다고 말하면서 서명이 유효하지 않습니다. 빈 서명 필드를 추가하고이 작업 tempPdf의 결과로 PDF 파일

public static string GetBytesToSign(string unsignedPdf, string tempPdf, string signatureFieldName) 
{ 
    if (File.Exists(tempPdf)) 
     File.Delete(tempPdf); 

    using (PdfReader reader = new PdfReader(unsignedPdf)) 
    { 
     using (FileStream os = File.OpenWrite(tempPdf)) 
     { 
      PdfStamper stamper = PdfStamper.CreateSignature(reader, os, '\0'); 
      PdfSignatureAppearance appearance = stamper.SignatureAppearance; 
      appearance.SetVisibleSignature(new Rectangle(36, 748, 250, 400), 1, signatureFieldName); 

      IExternalSignatureContainer external = new ExternalBlankSignatureContainer(PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_DETACHED); 

      MakeSignature.SignExternalContainer(appearance, external, 8192); 

      byte[] array = SHA256Managed.Create().ComputeHash(appearance.GetRangeStream()); 

      return Convert.ToBase64String(array); 
     } 
    } 
} 

의 서명 가능한 바이트를 가져옵니다

코드가 생성되고, 나는이 tempPdf에서 PDF 문서의 서명 가능한 바이트 해시를받을 파일.

다음 코드를 사용하여이 tempFile을 다시 열고 Base64로 인코딩 된 PKCS#7 서명을 삽입합니다. 임시 PDF 파일을 열고 signedPdf 내 마지막이 작업의 결과로 수신 된 서명

public static void EmbedSignature(string tempPdf, string signedPdf, string signatureFieldName, string signature) 
{ 
    byte[] signedBytes = Convert.FromBase64String(signature); 

    using (PdfReader reader = new PdfReader(tempPdf)) 
    { 
     using (FileStream os = File.OpenWrite(signedPdf)) 
     { 
      IExternalSignatureContainer external = new MyExternalSignatureContainer(signedBytes); 
      MakeSignature.SignDeferred(reader, signatureFieldName, os, external); 
     } 
    } 
} 

를 포함시킵니다

코드가 생성됩니다. 그러나 Adobe는 서명이 변경 또는 손상으로 인해 유효하지 않다고 말합니다.

enter image description here

My Original File

Temporary File Generated For Signing

Final Signed File

내가 웹 서비스로 전송되는 임시 파일 파일의 해시는 다음과 같습니다

z9qIyvtp4cRBZ1SSCQ + P0JVRinz5lv jYjXk3L7YP은/IE는 =

내가 웹 서비스에서받은 서명은 : 내가 생각 임시 서명 파일에 사용되는 임시 파일 및 signedFile의 바이트 임시 파일 만 0을 (비교

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 

)는 signedFile의 실제 서명으로 대체됩니다.

enter image description here

enter image description here

난 정말이 시점에서 막혔어요. 나는 내가 어디에서 다음에 있어야하는지에 관해 모른다.당신은 웹 서비스에서받은 서명에

+0

'GetBytesToSign'의'return' 라인이'Convert.ToBase64String (array)'이 아닌'Convert.FromBase64String (array)'를 정말로 리턴합니까? 전자는 base64 문자열이 아니므로 base64 문자열에서 * 변환하는 호출의 인수가 될 수 없습니다. – mkl

+0

죄송합니다. 오타였습니다. GetBytesToSign 외부에서 변환을 수행하면서 질문을 작성하는 동안 메소드 내부로 이동했습니다. –

+0

Raadol Hallederiz ..... – sotn

답변

1

가 : 여기

39 59: . . . SEQUENCE { 
    41 9: . . . . OBJECT IDENTIFIER data (1 2 840 113549 1 7 1) 
     : . . . . . (PKCS #7) 
    52 46: . . . . [0] { 
    54 44: . . . . . OCTET STRING  
     : . . . . . . 7A 39 71 49 79 76 74 70 z9qIyvtp 
     : . . . . . . 34 63 52 42 5A 31 53 53 4cRBZ1SS 
     : . . . . . . 43 51 2B 50 30 4A 56 52 CQ+P0JVR 
     : . . . . . . 69 6E 7A 35 6C 76 6A 59 inz5lvjY 
     : . . . . . . 6A 58 6B 33 4C 37 59 50 jXk3L7YP 
     : . . . . . . 2F 49 45 3D    /IE= 
     : . . . . . } 
     : . . . . } 
[...] 
1955 9: . . . . . SEQUENCE { 
1957 5: . . . . . . OBJECT IDENTIFIER sha1 (1 3 14 3 2 26) 
     : . . . . . . . (OIW) 
1964 0: . . . . . . NULL 
     : . . . . . . } 
1966 93: . . . . . [0] { 
1968 24: . . . . . . SEQUENCE { 
1970 9: . . . . . . . OBJECT IDENTIFIER contentType (1 2 840 113549 1 9 3) 
     : . . . . . . . . (PKCS #9) 
1981 11: . . . . . . . SET { 
1983 9: . . . . . . . . OBJECT IDENTIFIER data (1 2 840 113549 1 7 1) 
     : . . . . . . . . . (PKCS #7) 
     : . . . . . . . . } 
     : . . . . . . . } 
1994 28: . . . . . . SEQUENCE { 
1996 9: . . . . . . . OBJECT IDENTIFIER signingTime (1 2 840 113549 1 9 5) 
     : . . . . . . . . (PKCS #9) 
2007 15: . . . . . . . SET { 
2009 13: . . . . . . . . UTCTime 22/09/2017 13:18:38 GMT 
     : . . . . . . . . } 
     : . . . . . . . } 
2024 35: . . . . . . SEQUENCE { 
2026 9: . . . . . . . OBJECT IDENTIFIER messageDigest (1 2 840 113549 1 9 4) 
     : . . . . . . . . (PKCS #9) 
2037 22: . . . . . . . SET { 
2039 20: . . . . . . . . OCTET STRING  
     : . . . . . . . . . EF 37 38 3B B1 31 AB 96 .78;.1.. 
     : . . . . . . . . . CE FC 47 1E 32 A7 79 73 ..G.2.ys 
     : . . . . . . . . . 5D 95 15 04    ]... 
     : . . . . . . . . } 
     : . . . . . . . } 
     : . . . . . . } 
2061 13: . . . . . SEQUENCE { 
2063 9: . . . . . . OBJECT IDENTIFIER rsaEncryption (1 2 840 113549 1 1 1) 
     : . . . . . . . (PKCS #1) 
2074 0: . . . . . . NULL 
     : . . . . . . } 

당신의 base64로 인코딩 된 해시 포함 된 서명 된 데이터 (오프셋 56..99)로 나타납니다. 또한 해싱 알고리즘은 "SHA-1"(오프셋 1955.1965)으로 선택되며 서명 된 문서 해시는 SHA-1 해시 값의 크기와 일치하는 20 바이트 값입니다. 또한 RSA는 PKCS # 1 1.5 (2061.2075 오프셋)에 설명 된대로 서명에 사용됩니다.

따라서 서명 서비스는 입력을 base64로 인코딩 된 사전 계산 된 문서 해시 값으로 사용하지 않고 SHA1withRSA/2048을 사용하여 서명하는 일반 데이터로 보입니다.

그래서 오류는 iText에서 코드를 사용하는 것이 아니라 서명 서비스 호출 코드에서 발생합니다.

+0

고맙습니다. 명시 적으로 base64로 인코딩 된 해시 값에 대한 서명을 요청했지만 서비스에서 공유 한 서명을 반환했습니다. –

+0

SHA1 알고리즘이 서명에 사용 되었기 때문에 서명이 유효하지 않습니까? –

+0

아니요. 귀하가 제공 한 데이터는 이미 문서 데이터의 해시 였기 때문에 서비스는 해시해야하는 일반 데이터를 가져 왔습니다. – mkl