2017-01-04 9 views
0

Я оцениваю iText7 и не могу подписать PDF-код с самоподписанным сертификатом, который не имеет закрытого ключа.Подпишите PDF без закрытого ключа с iText7

Я пытаюсь сделать это:

 X509Store store = new X509Store(StoreLocation.CurrentUser); 

     store.Open(OpenFlags.ReadOnly); 
     var certs = store.Certificates.Find(X509FindType.FindBySubjectName, "MyName", false); 
     var refDate = DateTime.MinValue; 
     X509Certificate2 certificate = certs[0]; 

     var pk = DotNetUtilities.GetKeyPair(certificate.PrivateKey).Private; //how to do without private key ???? 

     IExternalSignature pks = new PrivateKeySignature(pk, "SHA-256"); 
     var bCert = DotNetUtilities.FromX509Certificate(certificate); 
     var chain = new Org.BouncyCastle.X509.X509Certificate[] {bCert}; 
     using (var reader = new PdfReader(@"D:\Test\ToSign.pdf")) 
     using (var stream = new FileStream(@"D:\Test\Signed.pdf", FileMode.OpenOrCreate)) { 
      PdfSigner signer = new PdfSigner(reader, stream, false); 
      signer.SignDetached(pks, chain, null, null, null, 0, PdfSigner.CryptoStandard.CMS); 
     } 

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

Можете ли вы сказать мне, как сделать то же самое?

С уважением

+3

Существует * всегда * закрытый ключ. Вы не можете создать цифровую подпись без закрытого ключа, поэтому ваше утверждение о том, что ваша текущая библиотека PDF может подписать PDF без какого-либо частного ключа, неверна. Возможно, вы не говорите о реальной ** цифровой подписи ** (что подразумевает PKI). Возможно, вы не знаете, что используется закрытый ключ (например, вы упоминаете PKCS # 12, но, возможно, ваша библиотека использует PKCS # 11). –

+0

. Чистые библиотеки безопасности иногда используют имена классов и методов, которые, как представляется, указывают на то, что имеется только сертификат, а на самом деле имеется сертификат плюс (необязательно) соответствующий личный ключ. Например. [X509Certificate2] (https://msdn.microsoft.com/en-us/library/windows/desktop/system.security.cryptography.x509certificates.x509certificate2 (v = vs.100) .aspx). – mkl

+0

Библиотека автоматически подписывает PDF-файл при создании PDFA-архива, если установлены следующие свойства: _conversion.CertificateName = _signature.CertificatDelivreA; _conversion.Issuer = _signature.CertificatDelivrePar; Он использует сертификат, хранящийся в хранилище сертификатов Windows, и сертификат не имеет встроенного ключа (в моем экземпляре cert [0] .HasPrivateKey является ложным). Я не знаю, как применяется подпись, и Adobe Reader четко говорит, что подпись не может быть проверена. – PatriceVB

ответ

1

Как другие упомянутые в комментариях: Когда есть открытый ключ всегда есть секретный ключ (который вы не можете иметь).

Но одна из возможностей заключается в том, что ваш компонент COM использует открытый ключ для процесса подписи. При асимметричном шифровании можно

  • шифруют с помощью закрытого ключа и расшифровки с помощью открытого ключа (так называемый цифровой подписи, который используется для PDF подписания) ИЛИ
  • можно зашифровать с помощью открытого ключа и расшифровки с помощью закрытого ключа (называемое шифрованием, которое используется в PGP).

Так может быть, этот компонент с помощью открытого ключа (вместо секретный ключ) для подписания, но, как упоминалось вы затем не состоянии проверить документ, так как в PDF подписывающего (нормально) открытый ключ прилагается к подписи. Если какой-либо PDF-ридер/библиотека получит документ, он выдаст ошибку, подтверждающую документ.

Чтобы «подражать» этому поведению в iText, вы можете взять открытый ключ из сертификата и преобразовать его в закрытый ключ и использовать его для подписания. Однако это не имеет смысла и, вероятно, создаст поврежденные файлы PDF, которые не поддаются проверке. Так что я советую против этого ...

+1

* «Возможно, этот компонент использует открытый ключ (вместо этого закрытый ключ) для подписания« * », но это не имеет никакого смысла, не так ли? Поскольку открытый ключ является частью сертификата, любой, у кого есть сертификат, может его подделать. – mkl

+0

* «Однако это не имеет смысла» *, чтобы процитировать мой пост ;-) – Lonzak

+0

Эх, да. ;) [В моем комментарии я смотрел только на родовую часть, а не на часть, связанную с iText, поэтому я забыл смелый материал ...] – mkl

Смежные вопросы