2

我使用iTextSharp簽署PDF文件。但是Adob​​e 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

Adob​​e提供的精確錯誤是什麼?即簽名是無效的還是CA未知? – 2009-12-04 19:11:04

回答

3

Adob​​e Reader無法驗證標誌,因爲需要將CA鏈導入到高級菜單中的Adobe Reader中,選項「管理受信任的標識」。 祝你好運!