C#通过外部服务使用itext签署pdf

C#通过外部服务使用itext签署pdf,c#,itext,digital-signature,C#,Itext,Digital Signature,我需要与外部web服务签署pdf。但在签名的pdf类文档上有一个错误,该文档自签名后已被更改或损坏 static void Main(string[] args) { //StreamSign(); PdfReader reader = new PdfReader(@"E:\pdf-exampleSign\example.pdf"); //MemoryStream os = new MemoryStream();

我需要与外部web服务签署pdf。但在签名的pdf类文档上有一个错误,该文档自签名后已被更改或损坏

static void Main(string[] args)
    {
        //StreamSign();
        PdfReader reader = new PdfReader(@"E:\pdf-exampleSign\example.pdf");
        //MemoryStream os = new MemoryStream();
        FileStream os = File.OpenWrite(@"E:\pdf-exampleSign\example_tmp.pdf");

        PdfStamper stamper = PdfStamper.CreateSignature(reader, os, '\0');
        PdfSignatureAppearance appearance = stamper.SignatureAppearance;
        appearance.SetVisibleSignature(new iTextSharp.text.Rectangle(36, 748, 144, 780), 1, "Signature");
        IExternalSignatureContainer external = new ExternalBlankSignatureContainer(PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_DETACHED);
        MakeSignature.SignExternalContainer(appearance, external, 20000);

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

        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < hash.Length; i++)
        {
            builder.Append(hash[i].ToString("x2"));
        }
        var hex = builder.ToString();

        //HERE IS THE SERVER SIDE BASE64 STRING I GOT
        string ServerSideSignedBytes = "MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgE.....";
        byte[] signbytes = Convert.FromBase64String(ServerSideSignedBytes);

        X509Certificate2 certt = new X509Certificate2(signbytes);
        var cert = new Org.BouncyCastle.X509.X509CertificateParser().ReadCertificate(certt.GetRawCertData());
        Org.BouncyCastle.X509.X509Certificate[] chain = new Org.BouncyCastle.X509.X509Certificate[1];
        chain[0] = cert;

        using (PdfReader prereader = new PdfReader(@"E:\pdf-exampleSign\example_tmp.pdf"))
        {
            using (FileStream preos = File.OpenWrite(@"E:\pdf-exampleSign\example_signed.pdf"))
            {
                IExternalSignatureContainer externallast = new MyExternalSignatureContainer(signbytes, chain);
                MakeSignature.SignDeferred(prereader, "Signature", preos, externallast);
            }
        }
    }
public class MyExternalSignatureContainer : IExternalSignatureContainer
{
    protected byte[] sig;
    protected Org.BouncyCastle.X509.X509Certificate[] chain;
    public MyExternalSignatureContainer(byte[] sig, Org.BouncyCastle.X509.X509Certificate[] chain)
    {
        this.sig = sig;
        this.chain = chain;
    }
    public byte[] Sign(Stream s)
    {
        return sig;
    }
    public void ModifySigningDictionary(PdfDictionary signDic) { }
}

static void Main(字符串[]args)
{
//StreamSign();
PdfReader reader=新的PdfReader(@“E:\pdf exampleSign\example.pdf”);
//MemoryStream os=新的MemoryStream();
FileStream os=File.OpenWrite(@“E:\pdf exampleSign\example_tmp.pdf”);
PdfStamper stamper=PdfStamper.CreateSignature(读卡器,操作系统,'\0');
PDFSignaturePearance外观=母版。SignaturePearance;
外观.SetVisibleSignature(新的iTextSharp.text.Rectangle(36748144780),1,“签名”);
IExternalSignatureContainer external=新的外部BlankSignatureContainer(PdfName.ADOBE_PPKLITE,PdfName.ADBE_PKCS7_);
MakeSignature.SignExternalContainer(外观,外部,20000);
byte[]hash=SHA256Managed.Create().ComputeHash(appearance.GetRangeStream());
StringBuilder=新的StringBuilder();
for(int i=0;i
//这是我得到的服务器端BASE64字符串
——每次重新启动代码时,都会得到一个不同的
哈希值
。因此,您不能简单地将检索到的某些签名字节用于不同的运行,更不用说用于不同的数据了。谢谢您的回答。我通过数字签名问题阅读了你的答案,得到了我需要的答案。再次感谢你。