7

我正在从事的一个 iOS 项目让我进入了 XML 数字签名的世界;我需要验证 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>
4

1 回答 1

9

为 iPhone编译xmlsec有点棘手,但可以完成。

首先,一些一般性的考虑:

  1. xmlsec是一个使用GNU 构建系统的 GNU 项目;构建一个这样的项目相当于运行一个脚本(配置)然后执行make. configure 将创建一个为您的确切系统配置量身定制的 Makefile,并允许您选择xmlsec在您的构建中包含或不包含哪些选项;

  2. xmlsec有几个来自其他库的依赖项:libssl, libcrypto(openssl 的一部分)、libxsltlibxml2libzlibiconv. 只有libxml2libz在 iPhone SDK 中可用,您需要在您的系统上安装所有其他可用的并且已经编译。这些库都是 GNU 项目,您可以通过应用与我稍后描述的相同的方法来编译它们xmlsec。一注:libxslt。Apple 包含libxslt在 iPhone SDK 中,但不提供 .h,因此您不能链接到 iPhone SDK 附带的 libxslt.dylib,您必须自己编译它。

  3. 将源文件从xmlseciPhone 项目中导入是很困难的,除非你知道哪些文件是合适的xmlsec,哪些是简单的依赖项(xmlsec源代码树包括 openssl、gnutls 等,这些文件不一定必须存在),但最重要的是因为你无法控制您希望在构建中包含(或排除)xmlsec 的哪些可选功能,例如 configure 为您做的;

  4. 因此,我首选的方法是正确使用 configure 以生成 iPhone 特定的 Makefile,然后构建静态库(因为您不允许在 iPhone 上使用外部 dylib);

xmlsec具体来说,为 iPhone编译的步骤是:

0 - 安装和编译所有依赖项;如果您找不到它们已经移植到 iPhone,您可以(递归地)对它们应用相同的方法;

1 - cd 到 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 - 配置将产生大量输出,如果一切顺利,您将能够执行命令:

make

3 - 这应该可以很好地完成并生成您的输出文件:src/.libs/libxmlsec1.a您可以链接到您的 iPhone 项目中(以及所有其他依赖的库)。

最后,一个关于为 iPhone 编译 openSSL 的教程

于 2011-05-28T14:07:31.090 回答