如何获取ADFS SAML响应数据?加密断言无法解析求助
问题分析与解决方案
兄弟,你这问题我太熟了——你拿到的SAML响应里的核心断言(Assertion)是加密状态的,这就是为啥你掏不出任何有效信息的原因!先看看你贴的响应内容(我帮你格式化了,看起来更清楚):
<samlp:Response Consent="urn:oasis:names:tc:SAML:2.0:consent:unspecified" Destination="https://demo.apps.com/adfsauthlogin/login" ID="_cbb5174b-36b4-4e75-9d8a-7f2d47ccb9bc" IssueInstant="2018-01-08T06:09:16.122Z" Version="2.0" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"> <Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">http://adfs.Sample.com/adfs/services/trust</Issuer> <samlp:Status> <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/> </samlp:Status> <EncryptedAssertion xmlns="urn:oasis:names:tc:SAML:2.0:assertion"> <xenc:EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"> <xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc"/> <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> <e:EncryptedKey xmlns:e="http://www.w3.org/2001/04/xmlenc#"> <e:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> </e:EncryptionMethod> <KeyInfo> <ds:X509Data xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <ds:X509IssuerSerial> <ds:X509IssuerName>CN=ADFS Encryption - demo.apps.com</ds:X509IssuerName> <ds:X509SerialNumber>33157209971584938906555805034885884694</ds:X509SerialNumber> </ds:X509IssuerSerial> </ds:X509Data> </KeyInfo> <e:CipherData> <e:CipherValue> ==- Value -== </e:CipherValue> </e:CipherData> </e:EncryptedKey> </KeyInfo> <xenc:CipherData> <xenc:CipherValue> ==- Value -== </xenc:CipherValue> </xenc:CipherData> </xenc:EncryptedData> </EncryptedAssertion> </samlp:Response>
为什么拿不到信息?
从响应里能明确看到,ADFS用了两层加密来保护敏感的断言内容:
- 用
aes256-cbc算法加密了实际的SAML断言数据 - 用
rsa-oaep-mgf1p算法加密了AES的对称密钥,并且绑定了ADFS的加密证书(CN=ADFS Encryption - demo.apps.com)
只有持有这个加密证书对应的私钥,才能解密拿到原始的明文断言。
怎么获取加密断言里的信息?
按以下步骤操作就行:
- 第一步:解密对称密钥
拿出你这边存储的ADFS Encryption - demo.apps.com证书的私钥,解密<e:EncryptedKey>里的<e:CipherValue>内容,得到AES256的对称密钥。 - 第二步:解密断言内容
用第一步得到的AES密钥,解密<xenc:EncryptedData>里的<xenc:CipherValue>,就能得到明文的<Assertion>XML。 - 第三步:解析明文断言
解析这个XML,就能拿到用户身份信息、属性声明、会话有效期等所有SAML断言里的内容了。
你的操作是否正确?
完全正确!从响应里的<samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>可以看出,ADFS已经成功完成了身份验证,并且返回了合法的响应——只是出于安全考虑,ADFS默认会加密包含敏感用户数据的断言,所以你只需要补全解密环节就可以了。
实操小建议
如果不想自己写解密代码,可以用现成的工具省事儿:
- 浏览器插件:SAML Tracer(可以捕获并自动解密SAML响应,前提是你能提供对应的私钥)
- 本地工具:OpenSSL命令行工具(可以处理RSA和AES的解密操作)
- 开发库:如果你是开发者,用OpenSAML(Java)、Kentor AuthServices(.NET)这类成熟的SAML库,它们都内置了加密断言的解密逻辑,只需要配置好证书私钥即可。
内容的提问来源于stack exchange,提问作者Dinesh92d
相关产品推荐
相关产品推荐

