Подпишите PDF без закрытого ключа с iText7

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

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

        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-файл без какого-либо закрытого ключа.

Подскажите, как сделать то же самое?

С Уважением


person PatriceVB    schedule 04.01.2017    source источник
comment
Есть всегда закрытый ключ. Вы не можете создать цифровую подпись без закрытого ключа, поэтому ваше утверждение о том, что вашей текущей библиотеке PDF удается подписать PDF без закрытого ключа, неверно. Возможно, вы не говорите о настоящей цифровой подписи (что подразумевает PKI). Возможно, вы не знаете, что используется закрытый ключ (например, вы упоминаете PKCS # 12; но, возможно, ваша библиотека использует PKCS # 11).   -  person Bruno Lowagie    schedule 04.01.2017
comment
Библиотеки безопасности .Net иногда используют имена классов и методов, которые, кажется, указывают на то, что имеется в виду только сертификат, в то время как на самом деле имеется сертификат плюс (необязательно) соответствующий закрытый ключ. Например. X509Certificate2.   -  person mkl    schedule 04.01.2017
comment
Библиотека автоматически подписывает PDF-файл при создании PDFA-архива, если заданы следующие свойства: _conversion.CertificateName = _signature.CertificatDelivreA; _conversion.Issuer = _signature.CertificatDelivrePar; Он использует сертификат, хранящийся в хранилище сертификатов Windows, и сертификат не имеет встроенного закрытого ключа (в моем примере cert [0] .HasPrivateKey имеет значение false). Я не знаю, как, но подпись применяется, и Adobe Reader четко говорит, что подпись не может быть проверена.   -  person PatriceVB    schedule 04.01.2017
comment
Не могли бы вы поделиться образцом этого PDF-файла, подписанного без закрытого ключа? Может быть, это поможет понять ваш сценарий.   -  person Egl    schedule 04.01.2017
comment
@PatriceVB да, поделитесь, пожалуйста, примером для ознакомления. Adobe Reader четко говорит, что подпись не может быть проверена. Возможно, мы говорим не о совместимой цифровой подписи, а о каком-то настраиваемом бессмысленном тоне без какой-либо защиты?   -  person mkl    schedule 05.01.2017


Ответы (1)


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

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

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

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

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

person Lonzak    schedule 05.01.2017
comment
Так что, возможно, этот компонент использует открытый ключ (вместо закрытого) для подписи - но в этом нет никакого смысла, не так ли? Поскольку открытый ключ является частью сертификата, любой, у кого есть сертификат, может его подделать. - person mkl; 05.01.2017
comment
Однако не имеет смысла цитировать мой пост ;-) - person Lonzak; 05.01.2017
comment
Эхм, да. ;) [В своем комментарии я смотрел только на общую часть, а не на часть, связанную с iText, поэтому я упустил жирный шрифт ...] - person mkl; 05.01.2017