Как проверить подпись XML в приложении iOS? - PullRequest
7 голосов
/ 06 мая 2011

Меня бросили в мир цифровых подписей XML с проектом iOS, над которым я работаю; Мне нужно проверить цифровую подпись утверждения SAML.

Я много читал о проверке подписей XML, и мне кажется, что я понимаю основы того, как он подписывает дайджест с помощью закрытого ключа, и я могу проверить его с помощью открытого ключа (который должен быть в прилагаемом сертификате x509). ) поэтому я могу быть уверен в источнике токена SAML.

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

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

Для чего стоит, вот часть утверждения SAML, которое я получаю от службы единого входа:

<?xml version="1.0" encoding="UTF-16"?>
<saml:Assertion ID="oQ2YZuHBspA_f91HM8o3.o6ZZla" IssueInstant="2011-05-06T00:51:40.733Z" Version="2.0" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<saml:Issuer>[...]</saml:Issuer>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <ds:SignedInfo>
        <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
        <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
        <ds:Reference URI="#oQ2YZuHBspA_f91HM8o3.o6ZZla">
            <ds:Transforms>
                <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
                <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
            </ds:Transforms>
            <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
            <ds:DigestValue>zj4pCHBNMln+28Jq/v1YIScfiuw=</ds:DigestValue>
        </ds:Reference>
    </ds:SignedInfo>
    <ds:SignatureValue>[...]</ds:SignatureValue>
    <ds:KeyInfo>
        <ds:X509Data>
            <ds:X509Certificate>MIIDVjCCAj6gAwIBAgIGAS67wkWCMA0GCSqGSIb3[...]7bgf</ds:X509Certificate>
        </ds:X509Data>
        <ds:KeyValue>
            <ds:RSAKeyValue>
                <ds:Modulus>[...]</ds:Modulus>
                <ds:Exponent>AQAB</ds:Exponent>
            </ds:RSAKeyValue>
        </ds:KeyValue>
    </ds:KeyInfo>
</ds:Signature>

1 Ответ

9 голосов
/ 28 мая 2011

Компиляция xmlsec для iPhone немного сложна, но может быть выполнена.

Прежде всего, некоторые общие соображения:

  1. xmlsec - проект GNU, использующий систему сборки GNU ; создание одного такого проекта равносильно запуску скрипта (конфигурации) и затем выполнению make. configure создаст Makefile с учетом вашей конкретной конфигурации системы и позволит вам выбрать, какие опции xmlsec включать или не включать в вашу сборку;

  2. xmlsec имеет несколько зависимостей от других библиотек: libssl, libcrypto (часть openssl), libxslt, libxml2, libz и libiconv. В iPhone SDK доступно только libxml2 и libz, и вам нужно, чтобы все остальные были доступны в вашей системе и уже скомпилированы. Эти библиотеки - все проекты GNU, которые вы можете скомпилировать, применяя тот же подход, который я опишу позже для xmlsec. Одно примечание: libxslt. Apple включает libxslt в iPhone SDK, но не делает доступным .h, поэтому вам не разрешено ссылаться на libxslt.dylib, который поставляется с iPhone SDK, и вам придется скомпилировать его самостоятельно.

  3. импортировать исходные файлы из xmlsec в проект iPhone сложно, если вы не знаете, какие файлы соответствуют xmlsec и являются простыми зависимостями (xmlsec дерево исходных текстов включает openssl, gnutls и т. Д., Которые не обязательно быть там), но прежде всего потому, что вы не можете контролировать, какие дополнительные функции xmlsec вы хотели бы включить (или исключить) в свою сборку, как это делает configure для вас;

  4. поэтому я предпочел подход, который заключается в правильном использовании configure для создания Make-файла для iPhone, а затем в создании статической библиотеки (поскольку вам не разрешено использовать внешний dylib на iPhone);

Конкретно шаги для компиляции xmlsec для iPhone:

0 - установить и скомпилировать все зависимости; если вы не можете найти их уже портированными для iPhone, вы можете применить (рекурсивно) тот же самый подход к ним;

1 - перейдите в корневой каталог libxmlsec и выполните команду:

CFLAGS=" -arch armv6 -std=c99 -isysroot /Volumes/ext/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk" CC="/Volumes/ext/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-gcc-4.2" ./configure --host=arm-apple-darwin10 --disable-shared --disable-crypto-dl --with-libxml=<path_to_where_libxml_is> --with-libxslt=<path_to_where_libxslt_is> --with-openssl=<path_to_where_openssl_is>

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

2 - configure выдаст много выходных данных, и, если все пойдет хорошо, вы сможете выполнить команду:

make

3 - это должно работать нормально до завершения и создать ваш выходной файл: src/.libs/libxmlsec1.a, который вы можете связать в своем проекте iPhone (вместе со всеми остальными зависит от библиотек).

Наконец, руководство по компиляции openSSL для iPhone .

...