代码之家  ›  专栏  ›  技术社区  ›  Václav Dajbych

签署PDF文件

  •  2
  • Václav Dajbych  · 技术社区  · 16 年前

    我用 伊斯特克利普 签署PDF文件。但是 土坯读出器 无法验证我的签名。我使用了由证书颁发机构生成的SHA-2测试证书(我还尝试了SHA-1)。我已经为这个授权的测试证书安装了根证书。

    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的更好的解决方案吗?

    1 回复  |  直到 16 年前
        1
  •  3
  •   Gustavo Cantero    16 年前

    Adobe Reader无法验证该标志,因为需要将CA链导入到高级人员中的Adobe Reader,选项“管理受信任的身份”。 祝你好运!

    推荐文章