2

나는 iTextSharp을 사용하여 PDF 파일에 서명합니다. 그러나 Adobe Reader은 내 서명을 확인할 수 없습니다. 나는 인증 기관에서 생성 한 SHA-2 테스트 인증서 (SHA-1도 시도 함)를 사용합니다. 이 기관의 테스트 인증서를위한 루트 인증서를 설치했습니다.PDF 파일에 서명

public static void SignHashed(X509Certificate2 card, Stream input, Stream output) { 
    Org.BouncyCastle.X509.X509CertificateParser cp = new Org.BouncyCastle.X509.X509CertificateParser(); 
    Org.BouncyCastle.X509.X509Certificate[] chain = new Org.BouncyCastle.X509.X509Certificate[] { cp.ReadCertificate(card.RawData) }; 

    PdfReader reader = new PdfReader(input); 
    PdfStamper stp = PdfStamper.CreateSignature(reader, output, '\0'); 
    PdfSignatureAppearance sap = stp.SignatureAppearance; 
    sap.SignDate = DateTime.Now; 
    sap.SetCrypto(null, chain, null, PdfSignatureAppearance.WINCER_SIGNED); 
    sap.Reason = "Testování"; 
    sap.Location = "Praha"; 
    sap.Acro6Layers = true; 
    sap.Render = PdfSignatureAppearance.SignatureRender.GraphicAndDescription; 
    PdfSignature dic = new PdfSignature(PdfName.ADOBE_PPKMS, PdfName.ADBE_PKCS7_SHA1); 
    dic.Date = new PdfDate(sap.SignDate); 
    dic.Name = PdfPKCS7.GetSubjectFields(chain[0]).GetField("CN"); 
    if (sap.Reason != null) dic.Reason = sap.Reason; 
    if (sap.Location != null) dic.Location = sap.Location; 
    sap.CryptoDictionary = dic; 
    int csize = 4000; 
    Hashtable exc = new Hashtable(); 
    exc[PdfName.CONTENTS] = csize * 2 + 2; 
    sap.PreClose(exc); 

    System.Security.Cryptography.HashAlgorithm sha = new System.Security.Cryptography.SHA1CryptoServiceProvider(); 

    Stream s = sap.RangeStream; 
    int read = 0; 
    byte[] buff = new byte[8192]; 
    while ((read = s.Read(buff, 0, 8192)) > 0) { 
     sha.TransformBlock(buff, 0, read, buff, 0); 
    } 
    sha.TransformFinalBlock(buff, 0, 0); 
    byte[] pk = SignMsg(sha.Hash, card, false); 

    byte[] outc = new byte[csize]; 

    PdfDictionary dic2 = new PdfDictionary(); 

    Array.Copy(pk, 0, outc, 0, pk.Length); 

    dic2.Put(PdfName.CONTENTS, new PdfString(outc).SetHexWriting(true)); 
    sap.Close(dic2); 
} 

누구나 PDF에 대한 더 나은 해결책을 알고 있습니까?

+0

Adobe에서 제공하는 정확한 오류는 무엇입니까? 나는. 서명이 유효하지 않거나 CA가 알려지지 않았습니까? –

답변

3

고급 체인의 Adobe Reader, "신뢰할 수있는 ID 관리"옵션에 CA 체인을 가져와야하기 때문에 Adobe Reader에서 서명을 확인할 수 없습니다. 행운을 빈다!