如何验证iOS应用程序中的XML签名?

时间:2011-05-06 16:47:30

标签: xml ios security digital-signature xml-signature

我正在研究一个我正在研究的iOS项目的XML数字签名世界;我需要验证SAML断言的数字签名。

我一直在阅读有关验证XML签名的很多内容,我认为我了解了如何使用私钥对摘要进行签名,我可以使用公钥验证它(应该包含在x509证书中) )所以我可以确定SAML令牌的来源。

我找到了一个C libray,xmlsec,看起来它有很多我需要的代码来验证签名,并且一直在努力实现它。但是,我无法弄明白。根据我的理解,我很确定我必须使用我的代码编译库。我已经将源代码复制到了我的项目中,但是在编译期间我发现了有关未定义的内容的错误。

在我花费无数个小时前往这条道路之前,我想我会联系社区,看看是否有人有任何验证xml数字签名的经验,以及他们是否可以深入了解在iOS项目中实现这一点。 / p>

对于它的价值,这是我从单点登录服务获得的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 个答案:

答案 0 :(得分:9)

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

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

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

  2. xmlsec有几个来自其他库的依赖项:libssllibcrypto(openssl的一部分),libxsltlibxml2,{{1 }和libz。 iPhone SDK中仅提供libiconvlibxml2,您需要在系统上提供所有其他可用且已编译的内容。这些库都是GNU项目,您可以通过应用与我稍后为libz描述的方法相同的方法进行编译。一个注意事项:xmlsec。 Apple在iPhone SDK中包含libxslt,但不提供.h可用,因此您不能链接到iPhone SDK附带的libxslt.dylib,您必须自己编译。 / p>

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

    < / LI>
  4. 我喜欢的方法是,正确使用configure以生成特定于iPhone的Makefile,然后构建一个静态库(因为你不允许在iPhone上使用外部dylib);

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

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

    1 - cd到libxmlsec root并执行命令:

    xmlsec

    在上面的命令中,我假设编译器将找到libxml头文件和可执行文件,因为它们是SDK的一部分。否则也包括它们。

    2 - configure将产生大量输出,如果一切正常,您将能够执行命令:

    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>

    3 - 这应该可以很好地完成并生成输出文件:make ,您可以在iPhone项目中链接(以及所有其他依赖于库的文件)。

    最后,tutorial about compiling openSSL for iPhone