T.M. SoftStudio

feci quod potui, faciant meliora potentes

Спецификация XML Signatures

Спецификация XML Signatures определяет правила обработки и синтаксис цифровой подписи XML-документов.

Цифровая подпись XML-документа — это битовое значение в формате Base64, полученное с помощью определенного алгоритма преобразования с использованием закрытого ключа, которое было применено к битовому значению, возвращенному в результате применения хэш-функции к XML-документу. Таким образом, цифровая подпись обеспечивает целостность XML-документа — хэш-значение изменяется при изменении документа, и аутентификацию документа — при преобразовании используется закрытый ключ.

Хэширование XML-документа производится с помощью алгоритма SHA-1, а получение цифровой подписи — с помощью алгоритма DSA или RSA. В результате применения хэш-функции SHA-1 к XML-документу получается 160-битовая строка, которая затем преобразуется с применением алгоритма DSA или RSA.

Алгоритм RSA (Rivest, Shamir и Adleman) — это ассиметричный алгоритм шифрования данных с использованием пары "закрытый ключ — открытый ключ". Алгоритм RSA может использоваться как для получения цифровой подписи, так и для шифрования данных. Так как в алгоритме RSA размер блока шифруемых данных ограничен размером ключа, то RSA-шифрование применяется к ключу симметричного шифрования, который шифруется с помощью алгоритма RSA с использованием открытого RSA-ключа. Затем зашифрованный симметричный ключ передается вместе с зашифрованными данными получателю, который расшифровывает симметричный ключ с помощью закрытого RSA-ключа и далее расшифровывает данные симметричным ключом.

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

Алгоритм DSA (Digital Signature Algorithm) — это, также как и RSA, ассиметричный алгоритм шифрования данных с использованием пары "закрытый ключ — открытый ключ". Однако в отличие от RSA, алгоритм DSA применяется только к хэш-значению, полученному хэшированием данных, поэтому DSA используется лишь для получения цифровой подписи. При использовании алгоритма DSA отправитель зашифровывает с помощью DSA хэш-значение данных закрытым DSA-ключом, а получатель расшифровывает его открытым DSA-ключом, чтобы затем сравнить два хэш-значения и проверить целостность данных.

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

Помимо цифровой подписи с данными может передаваться HMAC-значение, которое также подтверждает целостность данных и обеспечивает их аутентификацию. HMAC-значение (Hashed Message Authentication Code) получается хэшированием хэш-значения данных и общего (симметричного) для отправителя и получателя ключа. После получения таких данных адресат вычисляет свое HMAC-значение с использованием ключа и сравнивает его с переданным HMAC-значением. Если два значения совпадают, тогда целостность данных не была нарушена. Для защиты общего ключа может применяться механизм Kerberos, который основан на выдаче третьей стороной отправителю и получателю Kerberos-билетов, содержащих временный ключ. Kerberos-билет представляет собой данные, включающие в себя временный ключ и зашифрованные с помощью общего для третьей стороны и отправителя или получателя ключа.

Подпись XML-документов описывается с помощью набора XML-элементов, принадлежащих пространству имен http://www.w3.org/2000/09/xmldsig#.

Корневым элементом описания подписи является элемент <Signature>, имеющий дополнительный атрибут Id — идентификатор элемента, позволяющий использовать несколько подписей в XML-документе.

Элемент <SignatureValue> содержит значение цифровой подписи или HMAC-значение в формате Base64.

Элемент <SignedInfo> описывает, как была получена цифровая подпись и дополнительные данные, которые снабжаются цифровой подписью. Элемент <SignedInfo> имеет дополнительный атрибут Id (идентификатор элемента) и вложенные элементы <CanonicalizationMethod>, <SignatureMethod> и <Reference>.

Элемент <CanonicalizationMethod> — обязательный элемент, указывающий алгоритм канонизации, примененный к данным перед созданием цифровой подписи.

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

Спецификация XML Signatures указывает, что поддержка алгоритмов канонизации Canonical XML 1.0 и Canonical XML 1.1 должна быть обязательной, а поддержка алгоритмов канонизации Canonical XML 1.0 with Comments и Canonical XML 1.1 with Comments — рекомендованной.

Алгоритм канонизации указывается с помощью значения атрибута Algorithm элемента <CanonicalizationMethod>:

  • http://www.w3.org/TR/2001/REC-xml-c14n-20010315 — Canonical XML 1.0;

  • http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments — Canonical XML 1.0with Comments;

  • http://www.w3.org/2006/12/xml-c14n11 — Canonical XML 1.1;

  • http://www.w3.org/2006/12/xml-c14n11#WithComments — Canonical XML 1.1 with Comments.

Элемент <SignatureMethod> — обязательный вложенный элемент элемента <SignedInfo>, указывает алгоритм, который был применен для получения значения цифровой подписи, с помощью значения атрибута Algorithm:

  • http://www.w3.org/2000/09/xmldsig#dsa-sha1 — обязательный для поддержки алгоритм DSA;

  • http://www.w3.org/2000/09/xmldsig#rsa-sha1 — рекомендованный для поддержки алгоритм RSA-SHA1;

  • http://www.w3.org/2000/09/xmldsig#hmac-sha1 — обязательный для поддержки алгоритм HMAC.

В случае применения алгоритма HMAC для получения значения элемента <SignatureValue> элемент <SignatureMethod> может содержать вложенный элемент <HMACOutputLength>, значение которого определяет длину (усечение) HMAC-значения.

Дополнительный вложенный элемент <Reference> элемента <SignedInfo> описывает дополнительные данные, включаемые в цифровую подпись. Элемент <Reference> может иметь следующие атрибуты:

  • Id — идентификатор элемента;

  • URI — идентификатор объекта данных, включаемых в цифровую подпись;

  • Type — тип объекта данных в виде URI-идентификатора.

Кроме того, элемент <Reference> имеет следующие дочерние элементы:

  • <Transforms> — необязательный элемент, содержит последовательность элементов <Transform>, которые указывают преобразования, произведенные над объектом данных перед его хэшированием. Элемент <Transform> имеет атрибут Algorithm, определяющий алгоритм преобразования, и может содержать параметры преобразования. Спецификация XML Signatures рекомендует для поддержки следующие алгоритмы трансформации:

    – http://www.w3.org/TR/2001/REC-xml-c14n-20010315 — канонизация Canonical XML 1.0;

    – http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments — канонизация Canonical XML 1.0 with Comments;

    – http://www.w3.org/2006/12/xml-c14n11 — канонизация Canonical XML 1.1;

    – http://www.w3.org/2006/12/xml-c14n11#WithComments — канонизация Canonical XML 1.1 with Comments;

    – http://www.w3.org/2000/09/xmldsig#base64 — форматирование Base64;

    – http://www.w3.org/TR/1999/REC-xpath-19991116 — XPath-фильтрация. Элемент <Transform> содержит элемент <XPath>, описывающий XPath-выражения, которые преобразовали объект данных;

    – http://www.w3.org/2000/09/xmldsig#enveloped-signature удаляет элемент <Signature> из хэширования объекта данных, если он его содержал;

    – http://www.w3.org/TR/1999/REC-xslt-19991116 — XSLT-преобразование, Элемент <Transform> содержит элемент <stylesheet>, описывающий таблицу стилей XSLT-преобразования;

  • <DigestMethod> — обязательный элемент, указывает алгоритм хэширования объекта данных с помощью атрибута Algorithm. Спецификация XML Signatures требует поддержки алгоритма SHA1 со значением атрибута Algorithm="http://www.w3.org/2000/09/xmldsig#sha1";

  • <DigestValue> — обязательный элемент, содержит хэш-значение объекта данных в формате Base64.

Элемент <KeyInfo> является необязательным дочерним элементом элемента <Signature> и содержит информацию о публичном ключе цифровой подписи. Элемент <KeyInfo> служит контейнером для следующих элементов:

  • <KeyName> — имя ключа;

  • <KeyValue> — сам публичный ключ. Спецификация XML Signatures определяет вложенные элементы <DSAKeyValue> и <RSAKeyValue> для передачи публичных DSA- и RSA-ключей соответственно;

  • <RetrievalMethod> организует ссылку на информацию о публичном ключе, которая может быть определена вне элемента <KeyInfo>. Элемент <RetrievalMethod> имеет атрибуты URI (идентификатор объекта, на который ссылаются) и Type (URI-идентификатор типа объекта ссылки), а также вложенный элемент <Transforms>, указывающий преобразования объекта ссылки;

  • <X509Data> описывает X509-сертификат публичного ключа с помощью вложенных элементов <X509IssuerSerial>, <X509IssuerName>, <X509SerialNumber>, <X509SKI>, <X509SubjectName>, <X509Certificate>, <X509CRL>;

  • <PGPData> описывает публичные ключи стандарта PGP с помощью вложенных элементов <PGPKeyID> и <PGPKeyPacket>;

  • <SPKIData> описывает публичные ключи стандарта SPKI с помощью вложенных элементов <SPKISexp>;

  • <MgmtData> содержит зашифрованные ключи или соглашения о ключах.

Элемент <Object> также является необязательным дочерним элементом элемента <Signature> и содержит дополнительные данные, на которые можно ссылаться, пользуясь значением атрибута Id элемента <Object>. Элемент <Object>, помимо атрибута Id, имеет атрибуты MimeType (тип данных) и Encoding (URI-идентификатор кодировки данных).

Дополнительный дочерний элемент <Manifest> элемента <Object> служит контейнером для элементов <Reference>, описывающих дополнительные данные, включаемые в цифровую подпись. В отличие от вложенных элементов <Reference> элемента <SignedInfo>, условия проверки хэш-значений элемента <Manifest> определяются получателем. То есть если один из элементов <Reference> элемента <SignedInfo> является ошибочным, тогда вся цифровая подпись неверна, а если какой-либо из элементов <Reference> элемента <Manifest> является ошибочным, верность цифровой подписи определяет получатель.

Дополнительный дочерний элемент <SignatureProperties> элемента <Object> содержит дополнительную информацию о цифровой подписи, например, время действия цифровой подписи, роль владельца подписи и т. д.

Таким образом, создание цифровой подписи подразумевает следующие шаги:

  1. Вычисляются значения элементов <DigestValue> элементов <Reference> элемента <SignedInfo>. Для этого используются алгоритмы элементов <Transforms>, затем алгоритмы элементов <DigestMethod>.

  2. Вычисляется значение элемента <SignatureValue> с использованием элементов <CanonicalizationMethod>, <SignatureMethod> и <Reference> элемента <SignedInfo>, а также элементов <Object>.

Проверка цифровой подписи состоит из следующих действий:

  1. Полученный документ приводится к канонической форме согласно алгоритму, указанному в элементе <CanonicalizationMethod>.

  2. Вычисляются хэш-значения данных, указанных элементами <Reference> элемента <SignedInfo> с применением информации элементов <Transforms> и <DigestMethod>. Полученные значения сравниваются со значениями элементов <DigestValue>. Значения должны совпадать.

  3. Документ обрабатывается согласноя информации элементов <SignedInfo> и <Object>.

  4. На основе информации элементов <KeyInfo> и <SignatureMethod> подтверждается значение элемента <SignatureValue>.