Добавить цифровую подпись в PDF с помощью iTextSharp - сертификат SmartCard (защищен PIN-кодом) - PullRequest
0 голосов
/ 12 февраля 2019

Я использую следующий код для подписи документа PDF, но всегда получаю сертификат, который недействителен.

private void SignWithThisCert(X509Certificate2 cert)
        {
string SourcePdfFileName = Application.StartupPath + @"\Document.pdf";
string DestPdfFileName = Application.StartupPath + @"\Document.Signed.pdf";
Org.BouncyCastle.X509.X509CertificateParser cp = new Org.BouncyCastle.X509.X509CertificateParser();
Org.BouncyCastle.X509.X509Certificate[] chain = new Org.BouncyCastle.X509.X509Certificate[] { cp.ReadCertificate(cert.RawData) };

IExternalSignature externalSignature = new X509Certificate2Signature(cert, "SHA256");
PdfReader pdfReader = new PdfReader(SourcePdfFileName);
FileStream signedPdf = new FileStream(DestPdfFileName, FileMode.Create);  //the output pdf file
PdfStamper pdfStamper = PdfStamper.CreateSignature(pdfReader, signedPdf, '\0');
PdfSignatureAppearance signatureAppearance = pdfStamper.SignatureAppearance;

signatureAppearance.Reason = "Safe Document";
signatureAppearance.Location = "My place";            

signatureAppearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.GRAPHIC_AND_DESCRIPTION;
MakeSignature.SignDetached(signatureAppearance, externalSignature, chain, null, null, null, 0, CryptoStandard.CMS);
//MakeSignature.SignDetached(signatureAppearance, externalSignature, chain, null, null, null, 0, CryptoStandard.CADES);
pdfStamper.Close();
MessageBox.Show("Done");

}

Затем я просто вызываю этот метод:

//Sign from SmartCard
//note : ProviderName and KeyContainerName can be found with the dos command : CertUtil -ScInfo
string ProviderName = "cv act sc/interface CSP";
string KeyContainerName = "12345e02a1dcb12ece12345f0e203c093eb2f0ef";
string PinCode = "MYPINCODE";
if (PinCode != "")
{
    //if pin code is set then no windows form will popup to ask it
    SecureString pwd = GetSecurePin(PinCode);
    CspParameters csp = new CspParameters(1,
                    ProviderName,
            KeyContainerName,
            new System.Security.AccessControl.CryptoKeySecurity(),
            pwd);
    try
    {
        RSACryptoServiceProvider rsaCsp = new RSACryptoServiceProvider(csp);
                // the pin code will be cached for next access to the smart card
    }
    catch (Exception ex)
    {
            MessageBox.Show("Crypto error: " + ex.Message);
                return;
    }
}
var cert = Helper.GetCertBySubject("cert subject here");
SignWithThisCert(cert);

И он подписывает подпись к документу PDF, но когда я открываю его в считывателе, он говорит, что сертификат недействителен.

Я использую смарт-карту, защищенную ПИН-кодом, с неэкспортируемым частнымключ - PKCS # 12

Нужно ли мне использовать PK, может быть?

Большое спасибо

...