当前位置: 首页 > 知识库问答 >
问题:

验证SAML响应的签名

萧韬
2023-03-14

我试图遵循以下规范来验证SAML响应的签名:https://www.w3.org/tr/xmldsig-core/#sec-pkcs1

下面是我的工作流程:我得到SAML响应。我去掉签名信封,我把它规范化,我检查摘要,然后我检查签名。我能够成功地计算转换的SAML响应的SHA1摘要,并对其进行验证。然而,RSA-SHA1签名检查仍然无法实现。

SAML响应包含签名方法算法:http://www.w3.org/2000/09/xmldsig#rsa-sha1

我有这个检查签名的方法:

public static boolean verifySignature(String signatureType, PublicKey publicKey, byte[] contentBytes, byte[] sigBytes) {
    try {
        Signature sig = Signature.getInstance(signatureType);
        sig.initVerify(publicKey);
        sig.update(contentBytes);
        return sig.verify(sigBytes);
    } catch (Exception e) {
        Logger.log(e);
        return false;
    }
}

我做这样的事情来称呼它:

String publicKeyStr =  "MIIDNDCCAhwCCQCEk14scLMSGjANBgkqhkiG9w0BAQsFADBcMR8wHQYDVQQDDBZhdXRoLnJldHJvZmljaWVuY3kuY29tMQ4wDAYDVQQKDAVSZXRybzELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk1BMQ8wDQYDVQQHDAZCb3N0b24wHhcNMTYwMzAyMTU1NTQ4WhcNMTcwMzAyMTU1NTQ4WjBcMR8wHQYDVQQDDBZhdXRoLnJldHJvZmljaWVuY3kuY29tMQ4wDAYDVQQKDAVSZXRybzELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk1BMQ8wDQYDVQQHDAZCb3N0b24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDwUlZ+qOA61kYh0MGHKTe4JtSL1qJVT/8/i6sWFqbAiGdV33pxSm8iBpqLNPG+fr8aZKugik8mN3y0kZEDwD+EATXGUpqT1v1R6Wr4rRUwsC0wl6d6EiWfdSsu66T11hdrugXF/psjyy4mmvIMMU4RlSaZmT2+gpe57IWPO522Y1HqbuvSvKJgjdyrlhIKLmw7HvZ1ZrQ1j01Hd3/rdK41+zWpSCLuSellHowiDmOzNnyFpTw+SZA0GKE+cm3BOTj/cM36GR2XJd0kIRqj1qqu29cGMlBjQ3cMleG6HoHR9oPNFwYtW1fDTHG6MnxRXYCfZiPeBdX3eBDSuz7GQAv5AgMBAAEwDQYJKoZIhvcNAQELBQADggEBAEuQEPhpWdAGg46PSbE20bNt4YH+PjiIzPaXzN5UmpJjyl2kbR18HYXZHEtAXc+ItrYnK+oe+6FhwJ9aiwlrf1/p+U61iyvA9/HWzyW4vflaLWRQ8FxNhAJiVu57IQObjZ13EQfu1O8RK4wzNUVJhOz+pp9toqTHn8wmUPApzqMIl0KpDCPy1TNrwItaiy/gzWQngBMgIcrDeycR8wK2EH6txT8BzI+aqdIc3gBXsn/kS90lelbvYreXqF7VHoMs8fVEPN5fTRjqT9oZb60b1DxcniiTEknZtqprYuMpgEzpOHrzmlbCoNU2yBHuNTQWBz3lG+XtSMtgh16v5Vm48ag=";
PublicKey publicKey = Security.getPublicKey(publicKeyStr); // uses Certificate class
String sig = "QfAcRJM2P65JucyBpqn6j48/zd1oSLPBJ0lYI1grH5/xenwBEh0D4Eh0S1J3535OUmldpW7D+G7DW6eAT5N8TdoqUvMXuIAUpFHHDR45KZykPXJPUtli+z2rwlCCHypZWnniT/wrcQYdpp1zzNJBBtKdkaqQg0NMktPSQ/0ti+ruMI3qwfTaL9kDQ3Zyi/a2J3RCAPA0RfviLnDLlid0PthiV1NEbs0AvnguDi57fWXAILk0L1Cx20sliQckxlFQ9u4OaHeMscXdjh3SfESkM9m0Y9PppisZWTrCYzGmvDwsZTCBPD3f/ZFIit+Smgh2fi1u8/gZq0yizPyacR3Y/A==";
String newXMLToOperateOn = "<saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:xs="http://www.w3.org/2001/XMLSchema" ID="_420cc1a25a3890bd5df1f4c04bd7e986" ...";

boolean sign = Security.verifySignature("SHA1withRSA", pk, newXMLToOperateOn.getBytes(), Util.base64DecodeAsBytes(sig));
// SIGN IS FALSE!!!!

NewXMLToOperateON是SAMLResponse的正确规范化字符串XML。这是我用来生成正确的SHA1摘要的东西。security.verify()可以正常工作,因为我使用to来进行OpenID SSO检查,这也可以工作。

   CRYPT (PAD (ASN.1 (OID, DIGEST (data))))

在我验证签名的时候这帮不上什么忙。我无法重新创建签名,因为我找不到他们在示例中使用的私钥。

谢谢你的帮助。

共有1个答案

微生城
2023-03-14

您只需要验证XML的“SignedInfo”部分

 类似资料:
  • 2016年8月1日11:34:39 AM org.apache.catalina.core.standardWrapperValve在路径为[/travelocity.com]的上下文中为servlet[jsp]调用严重:servlet.service()引发了异常[SAML响应的签名验证失败],根本原因为org.wso2.carbon.identity.sso.agent.exception.s

  • 我们需要实现基于SAML的安全身份验证。我们的IDP将是Okta和OneLogin。为此,我们在节点中使用“passport”“passport saml”。JSExpress应用程序。我们在SP端为Okta使用以下策略配置- 对于OneLogin,我们使用- 但对于Okta,它给出的错误是“无法读取未定义的属性'getAttribute',对于OneLogin,它给出的错误是“无效签名”。此外,

  • 我在验证从ADFS服务器获得的SAML响应时遇到了问题。我以url的形式获得响应,例如,而是http://www.w3.org/2001/04/xmldsig-more#rsa-sha256。我设法解码了响应,但无法找到使用给定签名验证响应的方法。 我的主要问题是签名有一个非常意外的格式。由于给定的签名算法,我希望签名的长度为32字节,但是当我base64-decode签名时,我得到的是长度为25

  • 我通过HTTP重定向从ADFS获得了SAML响应,并且在重定向时收到了以下请求参数

  • OpenAM是否依赖于注册IDP的公钥来使SAML响应多样化 或还取决于来自IDP-like算法的SAML响应中的哈希算法=”http://www.w3.org/2000/09/xmldsig#sha1“” 注意OpenAM版本:13.0.0

  • 我可以通过HTTP-Redirect绑定登录和接收SAMLResponse,也可以使用privatekey解密和检索声明。 我的问题仍然是,我们需要验证saml响应(ADFS)吗?如果是如何做到这一点 我需要使用IP(身份提供商)公钥吗?它将在IP(元数据)中可用吗? 我在下面的请求参数中有SAML响应 SAMLACK=签名=hashvalue sigAlg=sha256 如何验证?