Основные принципы проверки XML-подписей

Adobe AIR 1.5 и более поздних версий

Краткое разъяснение и примеры кодов с проверкой подпиcей XML см. в следующих статьях по быстрому началу работы в центре Adobe Developer Connection:

Adobe® AIR® предлагает класс XMLSignatureValidator и интерфейс IURIDereferencer для проверки XML-подписей. XML-синтаксис, приемлемый для класса XMLSignatureValidator, определяется частью набора рекомендаций W3C для синтаксиса и порядка обработки XML-подписей. (Поскольку поддерживается только часть рекомендаций, не все допустимые подписи могут быть проверены.) Adobe AIR не предлагает прикладного интерфейса программирования для создания XML-подписей.

Классы проверки подписей XML

Прикладной интерфейс программирования для проверки XML-подписей содержит следующие классы:

Пакет

Классы

flash.security

Строковые константы XMLSignatureValidator определяются в следующих классах:

flash.events

Использование классов проверки XML-подписей

Чтобы использовать класс XMLSignatureValidator для проверки XML-подписи, необходимо выполнить следующие действия:

  • Создать объект XMLSignatureValidator

  • Обеспечить реализацию интерфейса IURIDereferencer. Объект XMLSignatureValidator вызывает метод dereference() интерфейса IURIDereferencer, передавая ему идентификатор ресурса URI для каждой ссылки в подписи. Метод dereference() должен выполнять разрешение идентификатора URI и возвращать упоминаемые в ссылках данные (которые могут находиться в том же документе, что и подпись, а также во внешнем источнике).

  • Установка параметров доверенности сертификата, проверки аннулирования и ссылочной проверки для объекта XMLSignatureValidator, как требуется для приложения.

  • Добавьте прослушиватели для событий complete и error .

  • Вызовите метод verify() , передав ему подпись для проверки.

  • Обработайте события complete и error , интерпретируйте результаты.

В следующем примере реализована функция validate() , которая проверяет достоверность XML-подписи. Свойства XMLSignatureValidator устанавливаются таким образом, что подписывающий сертификат должен находиться в хранилище доверенных сертификатов или быть связанным с сертификатом в хранилище доверенных сертификатов. В этом примере также предполагается, что в интерфейсе IURIDereferencer существует подходящий класс с именем XMLDereferencer .

private function validate( xmlSignature:XML ):void 
{ 
    var verifier:XMLSignatureValidator = new XMLSignatureValidator(); 
    verifier.addEventListener(Event.COMPLETE, verificationComplete); 
    verifier.addEventListener(ErrorEvent.ERROR, verificationError); 
    try 
    { 
        verifier.uriDereferencer = new XMLDereferencer(); 
 
        verifier.referencesValidationSetting = 
            ReferencesValidationSetting.VALID_IDENTITY; 
        verifier.revocationCheckSetting = RevocationCheckSettings.BEST_EFFORT; 
        verifier.useSystemTrustStore = true; 
         
        //Verify the signature 
        verifier.verify( xmlSignature ); 
    } 
    catch (e:Error) 
        { 
            trace("Verification error.\n" + e); 
        } 
} 
 
//Trace verification results 
private function verificationComplete(event:Event):void 
 
    var signature:XMLSignatureValidator = event.target as XMLSignatureValidator; 
    trace("Signature status: " + signature.validityStatus + "\n"); 
    trace("  Digest status: " + signature.digestStatus + "\n"); 
    trace("  Identity status: " + signature.identityStatus + "\n"); 
    trace("  Reference status: " + signature.referencesStatus + "\n"); 
} 
 
private function verificationError(event:ErrorEvent):void 
{ 
    trace("Verification error.\n" + event.text);                 
}

Процесс проверки XML-подписи

При вызове метода verify() класса XMLSignatureValidator в AIR выполняются следующие шаги:

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

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

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

    В целом существует три способа принятия решения, является ли сертификат надежным:

    • Можно положиться на полномочные органы сертификации и хранилище доверенных сертификатов операционной системы.

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

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

  • Среда выполнения проверяет криптографическую целостность подписанных данных.

    Подписанные данные проверяются с помощью реализованного интерфейса IURIDereferencer. Для каждой ссылки в документе подписи вызывается dereference() интерфейса IURIDereferencer. Данные, возвращаемые методом dereference() , используются для расчета дайджеста ссылки. Значение этого дайджеста сравнивается с дайджестом, записанным в документе подписи. Если дайджесты совпадают, то, значит, данные не изменялись с момента своего подписания.

    Важным условием обеспечения безопасности на основе проверки XML-подписи является принцип, что безопасно только подписанное содержимое. Для примера рассмотрим подписанный манифест, в котором перечислены файлы, входящие в пакет. Если объект XMLSignatureValidator проверяет подпись, он убеждается только в том, что не изменялся сам манифест. Данные в этих файлах не подписаны, поэтому подпись пройдет проверку даже в том случае, если упомянутые в манифесте файлы изменяются или удаляются.

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

Интерпретация результатов проверки

Результаты проверки передаются в свойствах состояния объекта XMLSignatureValidator. Эти свойства могут быть считаны после того, как объект validator отправит событие complete . Возможны четыре следующих состояния свойств: validityStatus , digestStatus , identityStatus и referencesStatus .

Свойство validityStatus

Свойство validityStatus сообщает об общей достоверности подписи. Свойство validityStatus зависит от состояния других трех свойств состояния и может принимать одно из следующих значений:

  • valid — Если свойства digestStatus , identityStatus и referencesStatus все имеют значение valid .

  • invalid — Если хотя бы одно из отдельных свойств состояния имеет значение invalid .

  • unknown — Если хотя бы одно из отдельных свойств состояния имеет значение unknown и нет отдельных свойств состояния со значением invalid .

Свойство digestStatus

Свойство digestStatus сообщает о результате криптографической проверки дайджеста сообщения. Свойство digestStatus может иметь одно из следующих значений:

  • valid — Если сам документ подписи не изменялся с момента подписания.

  • invalid — Если документ подписи был изменен с момента подписания.

  • unknown — Если выполнение метода verify() не было завершено без ошибок.

Свойство identityStatus

Свойство identityStatus сообщает о состоянии подписывающего сертификата. Значение этого свойства зависит от следующих факторов:

  • криптографической целостности сертификата;

  • не истек ли срок действия сертификата и не был ли он отозван;

  • доверен ли сертификат на этом компьютере;

  • состояние объекта XMLSignatureValidator (были ли добавлены дополнительные сертификаты для создания цепи подтверждения доверенности, были ли эти сертификаты доверенными, каковы значения свойств useSystemTrustStore и revocationCheckSettings )

Свойство identityStatus может иметь следующие значения:
  • valid — Чтобы расцениваться как действительный, подписывающий сертификат должен соответствовать следующим условиям:

    • Подписывающий сертификат не должен изменяться.

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

    • Подписывающий сертификат доверен. Сертификат считается доверенным, если он находится в хранилище доверенных сертификатов или связан с другим сертификатом в хранилище доверенных сертификатов и для его свойства useSystemTrustStore установлено значение true. Можно также определить доверен ли сертификат, используя метод addCertificate() объекта XMLSignatureValidator.

    • Этот сертификат, действительно, является подписывающим сертификатом.

  • invalid — Срок действия сертификата истек или он отозван; не предоставлено меток времени, удостоверяющих действительность сертификата во время подписания; возможно, сертификат был изменен.

  • unknown — В случае, если сертификат не является недействительным, но и не является доверенным. Самозаверяющие сертификаты, например, будут всегда получать состояние unknown (если они явным образом не отмечены как доверенные)З. Свойство identityStatus также получает значение unknown , если выполнение метода verify() не было завершено без ошибки, а также если достоверность не была проверена из-за недопустимости дайджеста подписи.

Свойство referencesStatus

Свойство referencesStatus сообщает о криптографической целостности ссылок в элементе SignedData подписи.

  • valid — Если вычисленный дайджест для каждой ссылки в подписи совпадает с соответствующим дайджестом, записанным в XML-подписи. Состояние valid означает, что подписанные данные не изменялись.

  • invalid — Если любой вычисленный дайджест не совпадает с соответствующим дайджестом в подписи.

  • unknown — Если дайджест ссылки не был проверен. Ссылки не проверяются, если общий дайджест подписи имеет состояние invalid или не действителен подписывающий сертификат. Если в свойстве identityStatus устанавливается значение unknown , то ссылки проверяются только в том случае, когда для свойства referencesValidationSetting задано validOrUnknown .