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

Меня бросило в мир цифровых подписей 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>

person Daniel    schedule 06.05.2011    source источник
comment
нет опыта проверки ... но какие ошибки компилятора вы получаете при попытке включить xmlsec? Вы связываетесь с libxml?   -  person shawnwall    schedule 27.05.2011
comment
Ошибки в основном связаны с включением заголовочных файлов; файлы заголовков/исходников используют операторы include с угловыми скобками, поэтому он ищет источник не в проекте, а в путях поиска заголовков... затем, как только я получаю их, возникают ошибки с определениями препроцессора и некоторыми настройками компиляции . Я связываюсь с libxml, просто включить xmlsec оказалось так сложно. Не могу найти никого, кто успешно сделал это с проектом iOS.   -  person Daniel    schedule 27.05.2011


Ответы (1)


Компиляция 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 для создания файла Makefile для 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.

person sergio    schedule 28.05.2011
comment
спасибо за отличное решение. извините, я пропустил присуждение награды. - person Chad Udell; 30.05.2011
comment
Большое спасибо за это подробное решение, но я боюсь, что вам, возможно, придется терпеть меня дальше, поскольку мы глубже погружаемся в компилятор, чем я знаком. В конечном счете, я хочу толстую статическую библиотеку для симулятора и устройства; в настоящее время я просто работаю над симулятором. Я успешно собрал библиотеки для 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). - person Daniel; 31.05.2011
comment
нет проблем... вы можете использовать, например, опцию компиляции -arch="arm6 arm7 i386", и это сделает это за вас. Я говорю это не в своем уме, поэтому, если это не сработает, скажите, и я проверю это где-нибудь ... или вы можете создать библиотеки для одной платформы, а затем использовать липо, чтобы сделать их толстыми. - person sergio; 31.05.2011
comment
Я начал с создания библиотек для одной платформы и планировал использовать липо, чтобы сделать их толстыми. Я думаю, что правильно собрал библиотеки для симулятора (i386), но теперь, когда я пытаюсь собрать xmlsec, я получаю сообщение об ошибке, что libcrypto.a не является объектным файлом. - person Daniel; 31.05.2011
comment
для сборки под i386 ничего особенного не нужно. просто выполните ./configure --disable-shared --disable-crypto-dl, а затем make. это сработало для меня. - person sergio; 31.05.2011
comment
еще одна вещь: я понимаю, что единственный подход, который имеет смысл, — это липосакция. указание нескольких платформ в -arch не будет работать. - person sergio; 31.05.2011
comment
Хорошо, я понял, что раньше делал неправильно (я скопировал и вставил из вашего ответа и забыл изменить архитектуру на i386 для симулятора). Я все исправил и подтвердил, что openssl и libxslt скомпилированы для i386, но теперь я получаю эту ошибку: ld: warning: ignoring file ../src/openssl/.libs/libxmlsec1-openssl.a, file was built for archive which is not the architecture being linked (i386). Вот где проявляется мое непонимание компилятора - этот файл был создан как часть этого процесса сборки ... почему бы ему не быть и i386? - person Daniel; 31.05.2011
comment
Фактические ошибки появляются после этого предупреждения, кстати. Ошибки про неопределенные символы (несомненно связанные с тем, что игнорирует libxmlsec1-oppenssl.a). - person Daniel; 31.05.2011
comment
Я почти уверен, что ваша .a статическая библиотека уже собрана, так как она не нуждается в компоновке. в любом случае, лекарство: make distclean; configure.... ; make - person sergio; 31.05.2011
comment
Я не могу получить прошлые ошибки о неопределенных символах. Вот краткое изложение того, что происходит: pastebin.com/STmBRMsP Вверху я показываю, что я делаю для настройки , а затем запускаю make. Через несколько секунд я получаю ошибки о неопределенных символах. Части, которые я не считал полезными, я заменил [...]. Я не понимаю, почему libxmlsec1-openssl.la будет общей библиотекой, если совместное использование отключено. Я очень ценю твою помощь, Серхио. - person Daniel; 01.06.2011
comment
Похоже, сбойная команда пытается создать исполняемый файл xmlsec1, который каким-то образом связан с общей библиотекой. Таким образом, одной из возможностей является удаление флага --disable-shared, чтобы динамические библиотеки были собраны и xmlsec1 были успешно собраны, и общая компиляция продолжилась. В противном случае я нашел 2 флага конфигурации, которые могут помочь: --enable-apps-crypto-dl=no и --enable-static-linking. Вы можете попробовать это. Во-первых, включите общие библиотеки (в конце концов, вы, конечно, будете использовать только статические), что кажется проще. - person sergio; 01.06.2011
comment
Привет, у тебя есть улучшения? - person sergio; 01.06.2011
comment
Я только что попытался удалить --disable-shared и получил аналогичную ошибку; неопределенные символы после предупреждения: ignoring file ../src/.libs/libxmlsec1.dylib, file was built for unsupported file format which is not the architecture being linked (i386). Я заметил, что без --disable-shared он пытался собрать для x86_64. - person Daniel; 02.06.2011
comment
интересно... во всяком случае, я компилировал для i386 и у меня была такая же ошибка с xmlsec1... дело в том, что библиотека была фактически создана (и это имеет смысл!) ls -l ./src/.libs/libxmlsec1.a // -rw-r--r-- 1 sergio wheel 727176 Jun 1 22:23 ./src/.libs/libxmlsec1.a - person sergio; 02.06.2011
comment
Я использовал эту строку конфигурации: CFLAGS=" -arch i386 -std=c99" CC="/Volumes/ext/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-gcc-4.2" ./configure --disable-shared --disable-crypto-dl, но у меня были установлены зависимости в стандартных местах, поэтому мне не нужно было указывать это... - person sergio; 02.06.2011
comment
Я заметил, что файлы были частично созданы, но я думаю, что в них отсутствует openssl. - person Daniel; 02.06.2011
comment
Просто мысль - какую версию xmlsec вы используете? Мне пришлось использовать версию 1.2.12, потому что она была последней, которая поддерживала libxml 2.7.3, версию в SDK для iOS. - person Daniel; 02.06.2011
comment
1.2.18; завтра (ночью тут) попробую 1.2.12, если надо. что касается openssl, я нахожу его здесь: ./src/openssl/.libs/libxmlsec1-openssl.a - person sergio; 02.06.2011
comment
Я тоже заметил этот файл. Но в готовом продукте отсутствуют символы, которые делают часть OpenSSL xmlsec непригодной для использования. - person Daniel; 02.06.2011
comment
Дэниел, это немного сложно. Я провел несколько тестов с символами, которые, как было сказано, отсутствовали, и они действительно были там (в .a). Для обеих библиотек. Например: nm -a src/.libs/libxmlsec1.a | grep _xmlSecXsltPushBin1 это выведет строку, где наличие t или T означает, что символ определен. Или: nm -a src/openssl/.libs/libxmlsec1-openssl.a | grep xmlSecOpenSSLAppShutdown. Я думаю, что при попытке слинковать бинарник сначала делается попытка использовать разделяемые библиотеки, и они терпят неудачу. configure не может линковаться с файлом .la, поэтому статические библиотеки не найдены. - person sergio; 02.06.2011
comment
Продолжая вышеизложенное: в моем случае это то, что происходит, потому что у меня есть стандартная установка (macports) openssl, libxml и т. д., поэтому компоновщик находит эти библиотеки под /opt/local/lib, и они явно созданы для x86_64. И еще: проверяли ли вы реальную архитектуру библиотек, на которые жалуется компоновщик? то есть lipo ../src/.libs/libxmlsec1.dylib. а как же lipo ../src/.libs/libxmlsec1.a? они i386 или x86_64? В общем, я думаю, что если вы используете src/.libs/libxmlsec1.a и src/openssl/.libs/libxmlsec1-openssl.a в своем проекте Xcode, это сработает. - person sergio; 02.06.2011
comment
Ребята (@sergio и @daniel), вы должны знать, что одна из причин, по которой пользователь сообщества (бот) помечает ветки комментариев с более чем 20 комментариями для проверки, заключается в том, что такие длинные обсуждения редко бывают хорошими. Чаще всего важную информацию о вопросе и/или ответе можно найти только в комментариях, и все это читают многие, и уж точно не поисковые системы. Если у вас есть важная информация, отредактируйте ее в вопросе и/или ответе. Если вы чувствуете необходимость подробно обсудить вопрос, есть чат-платформа, ссылка вверху страницы. Спасибо. - person Lasse V. Karlsen; 02.06.2011