#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 немного сложна, но может быть выполнена.
Прежде всего, некоторые общие соображения:
-
xmlsec
проект GNU использует систему сборки GNU; создание одного такого проекта сводится к запуску скрипта (configure) и последующему выполнениюmake
. configure создаст Makefile, адаптированный к конкретной конфигурации вашей системы, и позволит вам выбирать, какие параметрыxmlsec
включать или не включать в вашу сборку; -
xmlsec
имеет несколько зависимостей от других библиотек:libssl
,libcrypto
(часть openssl),libxslt
,libxml2
libz
иlibiconv
. В iPhone SDK доступны толькоlibxml2
иlibz
, и вам потребуется, чтобы все остальные были доступны в вашей системе и уже скомпилированы. Все эти библиотеки являются проектами GNU, которые вы можете скомпилировать, применив тот же подход, который я опишу позже дляxmlsec
. Одно замечание:libxslt
. Apple включаетlibxslt
в iPhone SDK, но не делает .h доступным, поэтому вам не разрешено ссылаться на libxslt.dylib, который поставляется с iPhone SDK, и вам придется скомпилировать его самостоятельно. -
импортировать исходные файлы из
xmlsec
проекта iPhone сложно, если вы не знаете, какие файлы являются правильными дляxmlsec
, а какие — простыми зависимостями (xmlsec
дерево исходных текстов включает openssl, gnutls и т.д., Присутствие которых там необязательно), Но прежде всего потому, что вы не можете контролировать, какие дополнительные функции xmlsec вы хотели бы включить (или исключить) в свою сборку, как это делает для вас configure; -
поэтому я предпочел правильно использовать 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 (вместе со всеми остальными зависящими от библиотеки).
Комментарии:
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
. у меня это сработало.