Как проверить XML-подпись в приложении iOS?

#xml #ios #security #digital-signature #xml-signature

#xml #iOS #Безопасность #цифровая подпись #xml-подпись

Вопрос:

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

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

Я нашел C libray, 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. нет опыта в проверке… но какие ошибки компилятора вы получаете при попытке включить xmlsec? Вы ссылаетесь на libxml?

2. Ошибки в основном связаны с включением файлов заголовков; в файлах заголовков / исходных текстов используются инструкции include с угловыми скобками, поэтому источник ищется не в проекте, а в путях поиска заголовка… затем, как только я получаю их включенными, возникают ошибки с определениями препроцессора и некоторыми настройками компиляции. Я ссылаюсь на libxml, это просто включение xmlsec, которое оказалось таким сложным. Не могу найти никого, кто успешно сделал это с помощью проекта iOS.

Ответ №1:

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

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

  1. xmlsec проект GNU использует систему сборки GNU; создание одного такого проекта сводится к запуску скрипта (configure) и последующему выполнению 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, чтобы создать Makefile для iPhone, а затем создать статическую библиотеку (поскольку вам не разрешено использовать внешний dylib на iPhone);

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

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

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

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 — настройка приведет к большому объему выходных данных, и, если все пойдет правильно, вы сможете выполнить команду:

 make
  

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

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

Комментарии:

1. спасибо за отличное решение. извините, я пропустил присуждение награды.

2. Большое спасибо за это подробное решение — но, боюсь, вам, возможно, придется потерпеть меня дальше, поскольку мы углубились в компилятор, с которым я не знаком. В конечном счете, мне нужна статическая библиотека fat для симулятора и устройства; в настоящее время я просто работаю над симулятором. Я успешно создал библиотеки для openssl и libxslt. Однако, когда я пытаюсь использовать make xmlsec, я получаю предупреждение о том, что libcrypto.a не переносим, и вскоре после этого эта ошибка: .libs/libxmlsec1-openssl.a(libcrypto.a) is not an object file (not allowed in a library with multiple architectures) .

3. нет проблем… вы можете использовать, например, опцию compile -arch="arm6 arm7 i386" , и это сделает это за вас. я говорю это из своего разума, так что, если это не сработает, скажите, и я это где-нибудь проверю … или вы могли бы создать библиотеки «single platform», а затем использовать lipo, чтобы сделать их толстыми.

4. Я начал с создания одноплатформенных библиотек и планировал использовать lipo, чтобы сделать их толстыми. Я думаю, что я правильно собрал библиотеки для симулятора (i386), но теперь, когда я пытаюсь собрать xmlsec, я получаю сообщение об ошибке о том, что libcrypto.a не является объектным файлом.

5. для сборки для i386 вам не должно понадобиться ничего особенного. просто выполните, ./configure --disable-shared --disable-crypto-dl а затем make . у меня это сработало.