Certificate 为什么证书在签名中?

Certificate 为什么证书在签名中?,certificate,signature,saml,Certificate,Signature,Saml,我必须为我公司的网站(作为依赖方)使用SAML实现SSO。场外的一个重要部分是验证签名。以下是我们的合作伙伴公司(声明方)的SAML样本的签名部分: bW1Os7+WykqRt5h0mdv9o3ZF0JI= cgrAN4T/UMOBHRKKTI3MiIRFBOZ7AAKSZJXUTWLZLU9JDPTXPNBOW8ZBYKZYYUW544WQGQPNG gr5GBWILSngURjf2N45/GDv7HMrv/NRMSRMRGVFFSKBCAOVQDLA24O0Q9CH5UDADAI1QTDR

我必须为我公司的网站(作为依赖方)使用SAML实现SSO。场外的一个重要部分是验证签名。以下是我们的合作伙伴公司(声明方)的SAML样本的签名部分:


bW1Os7+WykqRt5h0mdv9o3ZF0JI=
cgrAN4T/UMOBHRKKTI3MiIRFBOZ7AAKSZJXUTWLZLU9JDPTXPNBOW8ZBYKZYYUW544WQGQPNG
gr5GBWILSngURjf2N45/GDv7HMrv/NRMSRMRGVFFSKBCAOVQDLA24O0Q9CH5UDADAI1QTDRO3JX
nl4x7HaWIo9F8Gp/H1c=
MIIElzCCA3+GAWIBAGIQNT2I6HKJTCXFUFRB8QYSZJANBGKQHKIG9W0BAQUFADB3MQSWCQYDVQG
EWJGUJEOMAWGA1UEBXmfugfyaXdAKBGNVBaota3BZytegMB4Ga1UECxMXY2VydglmaWNHDGUG
YXV0AG9YAXRPZXMXKDAMBGNVBAMTH0FDIFBTQSBQZXVNZW90IENPDHJVZW4GUHJVZ3JHBXMWHCN
MDKWODE5MDCXNTE4WHCNMEWODE5MDCXNTE5WJCBHJELMAKGA1EBHMCZNIXHZADBGKQHKIG9W0B
CQEWEHBC3NLEHRABXBZYS5JB20XGDAWBGOJKIAJK/ISZAEBEHTZGVTB2WMDEMMAOGA1ECHMD
CHNHMEWDWYDVQLEWHWCM9NCMFTCZEBMBGA1UEAXMSVGVZDCATIFBBU1NFWFQGREVWMIGFMA0G
CSQGSIB3DQEBAQUA4GNADCBIQKBGQCUY1NREPGACVDSTLWK5A1CFOJSWDBL6CWFYP3CNYR0K3YV
e07MDZn+Rv4jo3SusHVFds+mzKX2f8AeZjkA3Me/0YIS9UPS9LQZU9MNHFLZRHMULDDOIZOVLXN
aOv/YHMPTQMQMJZU5TJQRAUQ7LA1C187AOJUNFPXT227N1VOQIDAQABO4IBKTCCAY0WDGYDVR0P
AQH/BAQDAGWGMB8GA1DIWQYMBAAFLCEWTTFVERUVCTDQWKMWO4U01X/MAwGA1UdEwEB/wQCMAAw
GBYGA1UDIASBRJCBQZCBQKAYKOF6ARFOEBBDCBMTBBBGGRBGEFBQCARY1AHR0CDOVL3JLDW5P
CY5PBMV0CHNHLLMNVBS9HDXRVCML0ZS9QY1BQY1QCM9NCMFTCY5WZGYWVAYYKWYBQUHAGIWSDAK
FGNWC2EWAWIBORO6UG9SAXRPCXVLIGRLIENLCNRPZMLJYXRPB24GuMgufnBifBLDWDLB3QGQ2L0
CM9LBIBQCM9NCMFTCZBCGNVHR8EVTBTMFGGT6BNHKTODHRWOI8VAW5MB2NLCNQUCHNHLXBLDWDL
b3QtY2l0cm9lbi5jb20vQUMtUFNBLVBldWdlb3QtQ2l0cm9lbi1Qcm9ncmFtcy5jcmwwHQYDVR0l
BBYWFAYKWYBBUHAWEGCCSGAQUFBWMBYGA1UDDGQPBA1BVRPX0DFTKVSQVRFMA0GCSQGSIB3
DQEBBQUAA4IBAQCVTP6BFKOUEHC6YUX0Q1GK2WAACX4ZIUB0TW2GR9I0276JRJR0EGUJ/N6Fn
3FHLQRSPMS97xVC9xMII66FQUDG64G9YQBECDIQUKR20VLGI6NQ8PLDQLWJU2YLKP15U7VF4QR
0PB2QILJZUCKDV3QDED2RI33ZA46LFYKRLWZB0UHTVUXI/AETJKVFAZAQANJG+vJyZI5b30z7g
FF8L3HT4Z7SFKDMY3IQSGZELIAAUFDUZJ0CWNGSU9D4BJU1BS8HWNYPWHK+NBJ7OFHDWYQFWQ
fhpBLq+ciJti9OMhcdCSIi0PbrOqzqtX7hZUQOvfShhCTJnl5TJJ
我不明白的是,为什么证书在签名中

我的意思是,通常我会以一种安全的方式从公司获得证书,所以我知道证书是从他们那里获得的。当签名验证成功时,我知道我们的合作伙伴公司已经签名了

但是当证书在SAML响应的签名内时,任何人都可以发送它!我所知道的唯一一件事是,回应没有被伪造。但问题是,我不知道是谁送的SAML


有人能向我解释一下,这是如何工作的吗?

签名证书的公共部分在SAML消息中。这用于检查令牌本身的签名,当然也允许接收者告知是谁颁发了令牌并对其进行相应处理


事实上,它是XML数字签名规范的一部分,它并不是SAML特有的。没有证书,您如何知道令牌来自何处,以及如何验证它


XmlDSig没有指定其他方法,您可以通过主题、序列号、散列等来识别签名密钥,但这假设接收方拥有公共证书。对于SAML,情况可能并非如此,因此嵌入X509证书的公共部分。

SAML响应带有签名和该签名的公钥

您可以使用公钥来验证SAML响应的内容是否与密钥匹配——换句话说,该响应肯定来自消息中具有与公钥匹配的私钥的人,并且响应没有被篡改

我不知道您使用的是什么技术,但在.Net中,您可以这样检查:

//加载新的XML文档
var断言=新的XmlDocument{PreserveWhitespace=true};
LoadXml(“发送给您的SAML XML”);
//使用名称空间管理器来避免最糟糕的XPath
var ns=新的XmlNamespaceManager(assertion.NameTable);
AddNamespace(“samlp”,“urn:oasis:names:tc:SAML:2.0:protocol”);
AddNamespace(“asrt”,“urn:oasis:names:tc:SAML:2.0:assertion”);
ns.AddNamespace(“dsig”,@”http://www.w3.org/2000/09/xmldsig#");
//获取节点到签名
var responseNode=assertion.SelectSingleNode(“/samlp:Response”,ns);
var assertionNode=responseNode.SelectSingleNode(“asrt:Assertion”,ns);
var signNode=assertionNode.SelectSingleNode(“dsig:Signature”,ns);
//加载XML签名
var signedXml=新的signedXml(assertion.DocumentElement);
signedXml.LoadXml(signNode作为XmlElement);
//获得证书,基本上:
//signedXml.KeyInfo[0]。证书[0]
//…但增加了铸造
var证书=GetFirstX509Certificate(signedXml);
//检查密钥和签名是否匹配
bool isSigned=signedXml.CheckSignature(证书,true);
这只是检查消息是否来自它所说的人。您需要额外检查消息是否来自您信任的人,此检查速度较慢-它需要包括吊销,并且可能需要验证整个证书链

通常,这是一个公钥列表,您可以从中接受SAML响应

然后,您可以检查此消息是否未被篡改,是否来自您信任的人,以便您可以授权提供的SAML属性中提供的用户详细信息

您可能已经拥有公钥,这意味着签名不需要再次包含公钥,但您也可以拥有多个可能的已知发件人,甚至是一个已知发件人链

例如,您可能有两个受信任的提供程序-在这两种情况下,您都要先检查消息是否被篡改,然后再检查您是否
<KeyDescriptor>
    <ds:KeyInfo>
        <ds:X509Data>
            <ds:X509Certificate>BQUAMCMBgN...XerfXHHEZYZs=</ds:X509Certificate>
        </ds:X509Data>
        <ds:X509Data>
            <ds:X509Certificate>H24a88h7zl...2zo28hH5DK78=</ds:X509Certificate>
        </ds:X509Data>
    </ds:KeyInfo>
</KeyDescriptor>