Подписание документа ITextSharp показывает недействительность

Итак, в последнее время я работал над подписанием PDF-документов, и сегодня я столкнулся с новой и замечательной проблемой. Поэтому, когда я подписываю документ (на самом деле документ подписан на сервере) и открываю этот документ на своем компьютере, подпись показывает, что она действительна и что она включена LTV, поэтому в значительной степени работает так, как ожидалось. Но когда я открываю тот же документ на компьютере моего босса, он показывает, что подлинность подписи не может быть проверена даже после того, как сертификат был доверенным, но если я открываю свойства сертификата, он говорит, что сертификат действителен и отзыв был выполнен успешно. Что может быть причиной этого?

На компьютере моего начальника это показывает, что личность подписавшего не может быть проверена, но на вкладке отзыва, когда я просматриваю свойства сертификата, указано, что сертификат подписи действителен

Рисунок 1: Сам сертификат является доверенным.

На компьютере моего начальника это показывает, что личность подписавшего не может быть проверена, но на вкладке отзыва, когда я просматриваю свойства сертификата, указано, что сертификат подписи действителен

Рисунок 2: Промежуточный сертификат является доверенным.

На компьютере моего начальника это показывает, что личность подписавшего не может быть проверена, но на вкладке отзыва, когда я просматриваю свойства сертификата, указано, что сертификат подписи действителен

Рисунок 3: Доверенный корневой сертификат

Подписанный документ: https://drive.google.com/file/d/0B9RyqgJoa6W8WlBLemVETXJRU0U/view?usp=sharing

Еще одна странная вещь, для подписи с отметкой времени, когда я добавляю корневой сертификат в качестве доверенного корневого сертификата в Adobe, он говорит, что LTV не включен, но если я добавляю сам сертификат GlobalTrustFinder в качестве доверенного сертификата, он говорит, что LTV включен. Есть ли причина, по которой он это сделает?

Любая помощь будет действительно оценена

Код для добавления LTV в существующие блоки подписи, а также для добавления подписи с отметкой времени:

private void SignDocumentSigningBlockAddLTVVerification(PdfStamper stamper, Certificate certificate)
    {
        LtvVerification ltvVerification = stamper.LtvVerification;
        List<string> signatureFieldNames = stamper.AcroFields.GetSignatureNames();
        ITSAClient tsaClient = new TSAClientBouncyCastle(_settingManager["DocumentSigningTimestampingServiceAddress"], String.Empty, String.Empty, Int32.Parse(_settingManager["DocumentSigningEstimatedTimestampSize"]), _settingManager["DocumentSigningEncryptionHashAlgorithm"]);
        IOcspClient ocspClient = new OcspClientBouncyCastle();
        ICrlClient crlClient = new CrlClientOnline(SignDocumentSigningBlockBuildChain(new X509Certificate2(certificate.Bytes, certificate.Password, X509KeyStorageFlags.Exportable)).ToList());

        PdfPKCS7 pkcs7 = stamper.AcroFields.VerifySignature(signatureFieldNames.Last());
        if (pkcs7.IsTsp)
        {
            ltvVerification.AddVerification(signatureFieldNames.Last(), ocspClient, crlClient, LtvVerification.CertificateOption.SIGNING_CERTIFICATE, LtvVerification.Level.OCSP_CRL, LtvVerification.CertificateInclusion.NO);
        }
        else
        {
            foreach (string name in stamper.AcroFields.GetSignatureNames())
            {
                ltvVerification.AddVerification(name, ocspClient, crlClient, LtvVerification.CertificateOption.WHOLE_CHAIN, LtvVerification.Level.OCSP_CRL, LtvVerification.CertificateInclusion.NO);
            }
        }
        ltvVerification.Merge();

        PdfSignatureAppearance appearance = stamper.SignatureAppearance;
        LtvTimestamp.Timestamp(appearance, tsaClient, null);
    }

С уважением


person Johandre    schedule 12.11.2015    source источник


Ответы (1)


Отзыв не может быть проверен

Но когда я открываю тот же документ на компьютере моего босса, он показывает, что подлинность подписи не может быть проверена даже после того, как сертификат был доверенным, но если я открываю свойства сертификата, он говорит, что сертификат действителен и отзыв был выполнен успешно. Что может быть причиной этого?

Поскольку я не могу проверить компьютер вашего босса, это наверняка будут догадки. Так...

Даю ему шанс

Вы говорите, что сертификат был доверенным, но задействовано много сертификатов. Итак, кому из них вы доверились? Судя по твоему скриншоту

На компьютере моего начальника это показывает, что личность подписавшего не может быть проверена, но на вкладке отзыва, когда я просматриваю свойства сертификата, указано, что сертификат подписи действителен

вы не доверяете сертификату пользователя (в противном случае этот сертификат не проверялся бы на соответствие CRL, а был бы признан доверенным без дальнейших проверок).

Возможно, вы доверяете корневому сертификату ЦС на компьютере вашего начальника. Если да, необходимо проверить не только сертификат конечного пользователя, но и промежуточный сертификат ЦС (SAPO Class 4 CA) ! Вероятно, в этом и заключается ваша проблема

Таким образом, когда вы находитесь на вкладке отзыва, выберите промежуточный сертификат и посмотрите, можно ли выполнить для него проверку отзыва. Если нет, то это проблема, с которой вы столкнулись.

ПС: это не так

ОП проверил идею, упомянутую выше, но

Поэтому я вернулся и проверил все сертификаты, и кажется, что проверка CRL выполняется, как и ожидалось.

Таким образом, это не так просто, как я думал выше

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

Итак, разница между результатами на этих двух компьютерах объяснена.

Чтобы определить, связана ли проблема с определением статуса отзыва сертификата ЦС или вашего пользовательского сертификата, не могли бы вы еще раз изменить настройки и доверять сертификату ЦС?

Если после этого изменения проблема остается, проблема, скорее всего, связана с вашим пользовательским сертификатом и проверкой статуса его отзыва. Если он исчезнет, ​​проблема, скорее всего, связана с проверкой статуса отзыва сертификата ЦС.

Теперь я доверяю ЦС, у него все еще есть та же проблема, но если я доверяю сертификату пользователя, пометив флажок «Использовать этот сертификат как доверенный корень» и «Сертифицированные документы», подпись отображается как действительная, а LTV включен, но только если я помечаю его как корень.Во всех остальных случаях в подписи есть предупреждение о том, что проверки отзыва не проводились.

Если вы сразу доверяете своему пользовательскому сертификату, подпись проверяется положительно без дальнейших церемоний. В конце концов, вы доверяете этому сертификату...

Помимо этого, уже есть проблема при проверке сертификата пользователя. Я постараюсь исследовать больше.

PPS: Вот почему...

Если ничего не помогло, начните проверять подпись или так я думал после того, как не смог найти ничего действительно плохого в сертификате. Я открыл подпись в утилите ASN.1 Dump и...

...
    <30 42>
2174   66:             SEQUENCE {
    <06 09>
2176    9:               OBJECT IDENTIFIER '1 2 840 113583 1 1 8'
    <31 35>
2187   53:               SET {
    <30 33>
2189   51:                 SEQUENCE {
    <A0 31>
2191   49:                   [0] {
    <30 2F>
2193   47:                     SEQUENCE {
    <2D 2D>
2195   45:                       Unknown (Reserved) {
    <2D 2D>
2197   45:                         Unknown (Reserved) {
    <2D 42>
2199   66:                           Unknown (Reserved) {
    <45 47>
2201   71:                             [APPLICATION 5]
         :                   'IN X509 CRL-----.MIIfZzCCHU8CAQEwDQYJKo0...*.H..'
         :                   '............0...Ix<..N+'
         :                   Error: IA5String contains illegal character(s).
Error: Inconsistent object length, 7 bytes difference.
         :                             }
Error: Inconsistent object length, 30 bytes difference.
         :                           }
Error: Inconsistent object length, 32 bytes difference.
         :                         }
Error: Inconsistent object length, 32 bytes difference.
         :                       }
Error: Inconsistent object length, 32 bytes difference.
         :                     }
Error: Inconsistent object length, 32 bytes difference.
         :                   }
Error: Inconsistent object length, 32 bytes difference.
         :                 }
Error: Inconsistent object length, 32 bytes difference.
         :               }
Error: Inconsistent object length, 32 bytes difference.
         :             }
...

Таким образом, есть синтаксические ошибки в самой подписи, точнее внутри атрибута информации об отзыве сертификата подписи PDF (OID 1 2 840 113583 1 1 8).

(Глядя на этот регион с помощью другого средства просмотра, можно увидеть текст (!) "-----BEGIN X509 CRL-----" - кажется, что текстовое представление CRL здесь недопустимо.)

Таким образом, Adobe Reader при попытке проверить отзыв сертификата во время проверки подписи проверяет атрибут подписи, который можно использовать для добавления информации об отзыве уже во время подписания, находит неверное значение атрибута и, кажется, останавливает проверку проверки с ошибкой...

Код, используемый для заполнения окна сведений о сертификате, кажется, закодирован отдельно.

Почему так?

Может возникнуть вопрос, каким образом текстовое представление CRL оказалось включенным в атрибут информации об отзыве сертификата подписи PDF вашей подписи.

Я просмотрел этот встроенный «CRL». Он в формате PEM и обрезается после 47 байт. Поэтому я получил доступ к CRL по URL-адресу, указанному в сертификате (https://pki.trustcentre.co.za/crl/sapo_c4ca.crl), и я действительно получил (полный) CRL в текстовом формате PEM. Код создания подписи, похоже, пытался включить его как есть, но он отключился.

Неправильно ли PKI предоставляет этот CRL в формате PEM, а не в формате DER? Или код создания подписи ошибается, предполагая найти CRL в кодировке DER в указанной позиции?

Текущая спецификация для сертификата инфраструктуры открытых ключей Интернета X.509 и профиля списка отозванных сертификатов (CRL) (RFC 5280) указывает:

Когда используется схема URI HTTP или FTP, URI ДОЛЖЕН указывать на один CRL в кодировке DER, как указано в [RFC2585].

(Раздел 4.2.1.13. Точки распространения CRL)< /эм>

Но это не говорит ничего эквивалентного о схеме HTTPS URI!

Поскольку PKI использует схему HTTPS, можно считать, что PKI соответствует букве RFC.

Несмотря на то, что схема HTTPS, по сути, является просто защищенным вариантом схемы HTTP, и поэтому PKI окончательно и без необходимости нарушает дух RFC, похоже, что она не нарушает его букву.

Таким образом, классы, извлекающие CRL (например, CrlClientOnline в iText), должны лучше проверять формат полученного CRL и при необходимости преобразовывать его.

С поддержкой LTV или без поддержки LTV

Объяснение

Еще одна странная вещь, для подписи с отметкой времени, когда я добавляю корневой сертификат в качестве доверенного корневого сертификата в Adobe, он говорит, что LTV не включен, но если я добавляю сам сертификат GlobalTrustFinder в качестве доверенного сертификата, он говорит, что LTV включен. Есть ли причина, по которой он это сделает?

Это довольно очевидно:

Если вы доверяете корневому сертификату, отзыв должен быть проверен для промежуточного ЦС и сертификатов конечного объекта. Поскольку в ваш документ не встроены CRL или ответы OCSP, ваша отметка времени не поддерживает LTV.

С другой стороны, если вы явно доверяете сертификату конечного объекта, тому самому сертификату, который создал отметку времени, валидатор Adobe немедленно доверяет отметке времени. Нет необходимости проверять отзыв явно доверенного сертификата... Таким образом, в этом случае включена отметка времени LTV.

(Термин «LTV включен» — это термин Adobe с очень переменным значением. Сведения об этом термине и другой терминологии, связанной с LTV, см. в разделе Общие сведения в этот ответ и другие ответы, на которые есть ссылки оттуда,)

Последующие вопросы

Что касается временных меток, я немного запутался, я следовал примерам кода в сообщении, которое вы рекомендовали, и код, который я использовал, был вариантом этого, но в принципе таким же, почему ответы CRL и OCSP не были встроены ?

Большая разница заключается в том, что код в моем указанном ответе делает не применять отметку времени документа, он просто добавляет информацию, связанную с проверкой (сертификаты, CRL, ответы OCSP).

Собственный термин Adobe «с поддержкой LTV» относится к подписи документа или отметке времени документа, для которой «вся информация, необходимая для проверки всех соответствующих подписей (включая подписи CRL, Ответы OCSP и метки времени, используемые в процессе проверки) в контексте настроек безопасности проверяющего Adobe Reader содержатся в PDF-файле». Ваш код после добавления информации, связанной с проверкой, добавляет метку времени документа, поэтому информация, необходимая для проверки этой метки времени, как правило, еще не доступна в PDF.

Стандартный термин ETSI «PDF-документ с LTV» относится к подписанному PDF-файлу с информацией, связанной с проверкой (например, PDF-файл с поддержкой LTV) плюс отметка времени окончательного документа.

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

Что касается добавления crls и ocsps, насколько я понял, для добавления LTV нужно добавить валидацию ко всем подписям в документе и метку конечного времени документа, как я это сделал в приведенном мной коде, разве это не кейс?

Существуют разные варианты использования в контексте LTV, и в зависимости от конкретного варианта использования может потребоваться добавить различную информацию.

person mkl    schedule 12.11.2015
comment
Спасибо за очень подробный ответ. Поэтому я вернулся и проверил все сертификаты, и кажется, что проверка CRL выполняется, как и ожидалось. Я доверял всем сертификатам в цепочке. Нужно ли доверять сертификату пользователя как корневому сертификату, потому что тогда проверки отзыва не выполняются? Что касается временных меток, я немного запутался, я следовал примерам кода в сообщении, которое вы рекомендовали, и код, который я использовал, был вариантом этого, но в принципе таким же, почему ответы CRL и OCSP не были встроены ? С уважением - person Johandre; 13.11.2015
comment
Я обновил исходный вопрос изображениями с вкладки отзыва, а также кодом, используемым для добавления проверки LTV в блоки подписи. - person Johandre; 13.11.2015
comment
Итак, проверяя еще раз, на панели подписи говорится, что отзыв не может быть проверен, но если я просматриваю свойства, он говорит, что он действителен ... Я что-то здесь не понимаю, потому что кажется, что проверка отзыва виновата здесь, но я не совсем понимаю, почему? - person Johandre; 13.11.2015
comment
Как упоминалось в моем ответе, мы можем только догадываться. Для более обоснованного ответа может быть полезно знать фактические различия (касающиеся настроек безопасности Adobe Reader и ОС) между вашим компьютером и компьютером вашего босса. - person mkl; 13.11.2015
comment
поэтому сначала разница в настройке заключалась в том, что я доверял сертификату, который я подписал, в качестве корневого сертификата, поэтому он отображался как успешно подписанный на моей машине, теперь я настроил свои параметры безопасности, чтобы у меня были те же результаты, что и на компьютер моего босса. У меня есть ощущение, что может быть что-то не так с CRL сертификата, потому что даже если я не использую LTV, сертификат все равно появляется, что CRL не может быть проверен. Я немного теряюсь в этом. Спасибо за вклад mkl: P - person Johandre; 13.11.2015
comment
Чтобы определить, связана ли проблема с определением статуса отзыва сертификата ЦС или вашего пользовательского сертификата, не могли бы вы еще раз изменить настройки и доверять сертификату ЦС? Если после этого изменения проблема остается, проблема, скорее всего, связана с вашим пользовательским сертификатом и проверкой статуса его отзыва. Если он исчезнет, ​​проблема, скорее всего, связана с проверкой статуса отзыва сертификата ЦС. - person mkl; 13.11.2015
comment
Теперь я доверяю ЦС, у него все еще есть та же проблема, но если я доверяю сертификату пользователя, пометив флажком «Использовать этот сертификат как доверенный корень и сертифицированные документы», подпись отображается как действительная, а LTV включен, но только если я отметьте его как корень. Во всех остальных случаях в подписи есть предупреждение о том, что проверки отзыва не проводились. Что касается добавления crls и ocsps, насколько я понял, для добавления LTV нужно добавить валидацию ко всем подписям в документе и метку конечного времени документа, как я это сделал в приведенном мной коде, разве это не кейс? - person Johandre; 13.11.2015
comment
См. мое последнее редактирование, подпись (или, точнее, атрибут подписи, который можно использовать для помещения информации об отзыве в саму подпись) не работает. - person mkl; 13.11.2015
comment
@user2699460 user2699460 Подписали ли вы PDF, используя правильную кодировку CRL? - person mkl; 16.11.2015
comment
извините за задержку ответа, к сожалению, я не контролирую CRL или сертификат, если на то пошло, он предоставлен третьей стороной. Итак, если я правильно понял ответ, проблема не в коде, а в стороннем CRL? И еще раз спасибо за подробный ответ. С уважением - person Johandre; 17.11.2015
comment
Значит, если я правильно понял ответ, проблема не в коде, а в стороннем CRL? - Встроенный CRL по крайней мере частично выглядит текстовым. Таким образом, это не CRL в ожидаемом двоичном формате. Я, очевидно, не знаю, является ли это текстовое представление тем, что доставляет третья сторона, или побочным эффектом вашего кода. - person mkl; 17.11.2015
comment
Я только что просмотрел CRL, встроенный в подпись. Он в формате PEM и обрезается после 47 байт. Поэтому я получил доступ к CRL по URL-адресу, указанному в сертификате, pki.trustcentre. co.za/crl/sapo_c4ca.crl, и я действительно получил (полный) CRL в формате PEM. http-схема из сертификата ДОЛЖНА быть предоставлена ​​в формате DER. Я предполагаю, однако, что эту PKI будет нелегко убедить изменить свою инфраструктуру. Таким образом, вам придется исправить формат где-то в вашем коде... - person mkl; 17.11.2015
comment
это имеет ооочень большой смысл. Спасибо, что заглянули в этот mkl. Я поговорю с компанией в пятницу, так как нас заверили, что они соблюдают стандарты, я новичок в части CRL, поэтому все еще разбираюсь с ней. Еще раз спасибо за подробный ответ. С уважением - person Johandre; 18.11.2015
comment
они следуют стандартам - они соответствуют, но не текущим, а прежним версиям. Я думаю, что rfc 3280 явно не требует формата der, но rfc 5280 требует. - person mkl; 18.11.2015
comment
@user2699460 user2699460 Я еще раз изучил это; Поскольку они используют HTTPS вместо HTTP, они действительно могут соответствовать букве RFC (но определенно не духу!). Для получения более подробной информации см. мое недавнее редактирование. - person mkl; 19.11.2015
comment
Огромное спасибо за это! Я поговорю с компанией и проверю, есть ли у них доступный URL-адрес DER, в противном случае я попытаюсь выполнить проверки в коде. Еще раз спасибо, что заглянули дальше, чем ожидалось :) С уважением - person Johandre; 20.11.2015