我是一名SP,最近需要与IDP集成。在IDP的文档中,它会向我发送一个http post响应。在响应中,有ds:SignatureValue和ds:X509Certificate。有一个类似SAML的线程:为什么证书在Signature中?,线程只回答如何检查消息是否来自它所说的人。
1) ds:SignatureValue和ds:X509Certificate的含义是什么?
2) 如何确保响应来自我的IDP?我的意思是,如果黑客知道我的http发布地址,他们可以很容易地向我的应用程序发送类似的http发布请求。我发现http请求标头中有一个referer,验证来自我的IDP的请求是否安全?
3) IDP要求我发送SP公共签名证书,格式应该是DER编码的二进制X.509(*.CER)。如何创建公共公共签名证书?
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
<ds:Reference URI="#_2152811999472b94a0e9644dbc932cc3" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:Transforms xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ec:InclusiveNamespaces PrefixList="ds saml samlp xs" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
<ds:DigestValue xmlns:ds="http://www.w3.org/2000/09/xmldsig#">bW1Os7+WykqRt5h0mdv9o3ZF0JI=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
SignatureValue </ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>X509 certification</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
- 两者都是XML数字签名的元素。
ds:SignatureValue
元素包含SAML响应的实际签名,该签名是Base64编码的。ds:X509Certificate
元素是签名证书(包含公共密钥和其他IdP的信息)。检查-XML有关详细信息,请参阅数字签名规范 - 您可能拥有来自其元数据的IdP证书。使用IdP证书,用于对传入的SAML响应进行签名并与进行比较从IdP接收CCD_ 3。如果这两个签名值匹配,那么您可以确保SAML响应确实是由您的IdP发送的。请检查此代码,了解如何使用OpenSAML实现验证SP从IdP发送的响应。(注意:这是我的repo,在这里我使用OpenSAML实现了SAML2.0)
- 要生成证书,可以使用各种工具和库。一个已知Java中的工具是Keytool。登录谷歌,你会发现很多这方面的教程