Краткое разъяснение и примеры кодов с проверкой подпи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
.
|
|
|