Dan*_*iel 7 xml security digital-signature ios xml-signature
我正在研究一个iOS项目的XML数字签名世界; 我需要验证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>
Run Code Online (Sandbox Code Playgroud)
xmlsec为iPhone 编译有点棘手但可以完成.
首先,一些一般性的考虑因素:
xmlsec是一个使用GNU构建系统的GNU项目; 构建一个这样的项目相当于运行脚本(configure)然后执行make.configure将创建一个为您的确切系统配置量身定制的Makefile,并允许您选择xmlsec在您构建中包含或不包含的选项;
xmlsec具有从其他库几个依赖关系:libssl,libcrypto(OpenSSL的部分), ,libxslt,libxml2,libz和libiconv.只有libxml2和libz在iPhone SDK可用,你需要有系统上所有可用的和已编译的其他人.这些库都是GNU项目,您可以通过应用与我稍后描述的方法相同的方法进行编译xmlsec.一点说明:libxslt.包括苹果libxslt在iPhone SDK,但不会使.H可用的,所以你不能链接到libxslt.dylib附带了iPhone SDK,你将不得不编译它自己.
将源文件导入xmlsec到iPhone项目中是很困难的,除非你知道哪些文件是合适的,哪些文件是xmlsec简单的依赖项(xmlsec源代码树包括openssl,gnutls等,这些文件当然不是必需的),但最重要的是因为你无法控制你希望在你的构建中包含(或排除)xmlsec的哪些可选功能,比如configure为你做的;
该方法我是优选的,因此,适当地使用配置,以便产生一个特定于iPhone的生成文件,然后生成一个静态库(因为你不允许在iPhone上使用外部dylib);
具体来说,xmlsec为iPhone 编译的步骤是:
0 - 安装并编译所有依赖项; 如果你找不到它们已经移植到iPhone,你可以(递归地)应用这些方法;
1 - cd到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 - configure将产生大量输出,如果一切正常,您将能够执行命令:
make
Run Code Online (Sandbox Code Playgroud)
3 - 这应该很好地完成并生成你的输出文件:src/.libs/libxmlsec1.a你可以在你的iPhone项目中链接(连同所有其余的依赖于库).
最后,有关为iPhone编译openSSL的教程.
| 归档时间: |
|
| 查看次数: |
3248 次 |
| 最近记录: |