我正在从事的一个 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>