Подписывайте PDF, используя Aspose PDF и внешний закрытый ключ в хранилище ключей Azure. - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь подписать цифровой PDF-файл с помощью Aspose Pdf, используя внешнее устройство для фактической подписи, в данном случае хранилище ключей Azure.У iText есть очень хороший механизм для этого.Они предоставляют интерфейс IExternalSignature, который вы можете реализовать, который обеспечивает функциональность Sign, однако я не могу найти ничего похожего с Aspose Pdf.

Я работаю с примерами из этого сообщения блога: https://rahulpnath.com/blog/signing-a-pdf-file-using-azure-key-vault/

Кто-нибудь знает, как третий пример (неэкспортируемый сертификат) может быть реализован с помощью Aspose Pdf?

1 Ответ

0 голосов
/ 01 марта 2019

Вы можете использовать ExternalSignature объект, который предоставляет X509Certificate2 для подписи документа.Пожалуйста, используйте следующий фрагмент кода.В этих примерах хранилище сертификатов Windows используется для получения сертификата для подписи:

// The System.Security.dll assembly should be added into References

// Signing 1. Using SignatureField
public void Sign_With_SmartCard_1()
{
    const string dataDir = @"c:\";

    File.Copy(dataDir + "blank.pdf", dataDir + "externalSignature1.pdf", true);
    using (FileStream fs = new FileStream(dataDir + "externalSignature1.pdf", FileMode.Open, FileAccess.ReadWrite))
    {
        using (Document doc = new Document(fs))
        {
            SignatureField field1 = new SignatureField(doc.Pages[1], new Rectangle(100, 400, 10, 10));

            // Sign with certificate selection in the windows certificate store
            X509Store store = new X509Store(StoreLocation.CurrentUser);
            store.Open(OpenFlags.ReadOnly);
            // Manually chose the certificate in the store
            X509Certificate2Collection sel = X509Certificate2UI.SelectFromCollection(store.Certificates, null, null, X509SelectionFlag.SingleSelection);

            Aspose.Pdf.Forms.ExternalSignature externalSignature = new Forms.ExternalSignature(sel[0])
            {
                Authority = "Me",
                Reason = "Reason",
                ContactInfo = "Contact"
            };

            field1.PartialName = "sig1";
            doc.Form.Add(field1, 1);
            field1.Sign(externalSignature);
            doc.Save();
        }
    }

    using (PdfFileSignature pdfSign = new PdfFileSignature(dataDir + "externalSignature1.pdf"))
    {
        IList<string> sigNames = pdfSign.GetSignNames();
        for (int index = 0; index <= sigNames.Count - 1; index++)
        {
            if (!pdfSign.VerifySigned(sigNames[index]) || !pdfSign.VerifySignature(sigNames[index]))
            {
                throw new ApplicationException("Not verified");
            }
        }
    }
}

// Signing 2. Using PdfFileSignature
public void Sign_With_SmartCard_2()
{
    const string dataDir = @"c:\";

    Document doc = new Document(dataDir + "blank.pdf");

    using (PdfFileSignature pdfSign = new PdfFileSignature())
    {
        pdfSign.BindPdf(doc);

        //Sign with certificate selection in the windows certificate store
        X509Store store = new X509Store(StoreLocation.CurrentUser);
        store.Open(OpenFlags.ReadOnly);
        //manually chose the certificate in the store
        X509Certificate2Collection sel = X509Certificate2UI.SelectFromCollection(store.Certificates, null, null, X509SelectionFlag.SingleSelection);

        Aspose.Pdf.Forms.ExternalSignature externalSignature = new Forms.ExternalSignature(sel[0]);
        pdfSign.SignatureAppearance = dataDir + "demo.png";
        pdfSign.Sign(1, "Reason", "Contact", "Location", true, new System.Drawing.Rectangle(100, 100, 200, 200), externalSignature);
        pdfSign.Save(dataDir + "externalSignature2.pdf");
    }

    using (PdfFileSignature pdfSign = new PdfFileSignature(dataDir + "externalSignature2.pdf"))
    {
        IList<string> sigNames = pdfSign.GetSignNames();
        for (int index = 0; index <= sigNames.Count - 1; index++)
        {
            if (!pdfSign.VerifySigned(sigNames[index]) || !pdfSign.VerifySignature(sigNames[index]))
            {
                throw new ApplicationException("Not verified");
            }
        }
    }
}

Мы надеемся, что это будет полезно.Пожалуйста, не стесняйтесь обращаться к нам, если вам нужна дополнительная помощь.

...