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

通过GET方法对SAML验证请求进行签名验证失败

范安歌
2023-03-14

我尝试了很多解决方案,但都是徒劳的。这就是我按照https://docs.oasis-open.org/security/saml/v2.0/saml-bindings-2.0-os.pdf的指导方针所做的:

>

  • 台阶

    1. 对auth请求进行放气,然后对其进行base64编码,最后对其进行Url编码。我们称之为AR
    2. Url编码RelayState。我们称之为RS
    3. Url编码签名算法字符串。我们称之为SA
    4. 因此,要签名的字符串现在变成SAMLRequest=AR

    所有这些工作正常,但签名验证失败了!

    这是我的代码,它类似于这里找到的代码https://github.com/Sustainsys/Saml2/blob/v0.21.2/Kentor.AuthServices/WebSSO/Saml2RedirectBinding.cs#L53-L68

    protected void btnSendAuthRequest_Click(object sender, EventArgs e)
        {
            string authRequest = txtInput.Text;
            //authRequest = authRequest.TrimEnd('\r', '\n');
            authRequest = DeflateBase64UrlEncode(authRequest);
    
            string spPrivateKey= txtKey.Text;
            string relayState = HttpUtility.UrlEncode("https://example.com/pages/home.aspx");
    
            string qs = "SAMLRequest=" + authRequest + "&RelayState=" + relayState;
            qs = AddSignature(qs, spPrivateKey);
    
            txtOutput.Text = qs;
        }
    
    public string AddSignature(string queryString, string PrivateKeyNoHeaders)
        {
            RSACryptoServiceProvider tmpRsa = RSAKeyTests.RSAKeyUtils.DecodePrivateKeyInfo(Convert.FromBase64String(PrivateKeyNoHeaders));
    
            string signingAlgorithmUrl = "http://www.w3.org/2000/09/xmldsig#rsa-sha1";
    
            queryString += "&SigAlg=" + HttpUtility.UrlEncode(signingAlgorithmUrl);
    
            var signatureDescription = (SignatureDescription)CryptoConfig.CreateFromName(signingAlgorithmUrl);
            HashAlgorithm hashAlg = signatureDescription.CreateDigest();
            hashAlg.ComputeHash(Encoding.UTF8.GetBytes(queryString));
    
    AsymmetricSignatureFormatter asymmetricSignatureFormatter =
                signatureDescription.CreateFormatter(
                    ((RSACryptoServiceProvider)tmpRsa));
            //.GetSha256EnabledRSACryptoServiceProvider()); 
            // Is the signature failing because of above ? 
    
            byte[] signatureValue = asymmetricSignatureFormatter.CreateSignature(hashAlg);
            queryString += "&Signature=" + HttpUtility.UrlEncode(Convert.ToBase64String(signatureValue));
    
            return queryString;
        }
    
    private string DeflateBase64UrlEncode(string input)
        {
            var inputs = string.Format(input, Guid.NewGuid());
            var bytes = Encoding.UTF8.GetBytes(inputs);
            using (var output = new MemoryStream())
            {
                using (var zip = new DeflateStream(output, CompressionMode.Compress))
                {
                    zip.Write(bytes, 0, bytes.Length);
                }
                var base64 = Convert.ToBase64String(output.ToArray());
                return HttpUtility.UrlEncode(base64);
            }
        }
    
  • 共有1个答案

    栾峰
    2023-03-14

    CryptoConfig.createFromName(…)不知道http://www.w3.org/2000/09/xmldsig#rsa-sha1作为摘要签名算法。如果<code>加密配置。createFromName()不返回null,无论为<code>注册了什么算法http://www.w3.org/2000/09/xmldsig#rsa-sha1可能不是RSA-sha1。下面是使用RSA和sha1的<code>签名描述的显式实现:

    public class RSASHA1SignatureDescription : SignatureDescription {
    
            public RSASHA1SignatureDescription() {
                KeyAlgorithm = "System.Security.Cryptography.RSA";
                DigestAlgorithm = "System.Security.Cryptography.SHA1Cng";
                FormatterAlgorithm = "System.Security.Cryptography.RSAPKCS1SignatureFormatter";
                DeformatterAlgorithm = "System.Security.Cryptography.RSAPKCS1SignatureDeformatter";
                _hashAlgorithm = "SHA1";
            }
    
            public override AsymmetricSignatureDeformatter CreateDeformatter(AsymmetricAlgorithm key) {
                AsymmetricSignatureDeformatter item = (AsymmetricSignatureDeformatter) CryptoConfig.CreateFromName(DeformatterAlgorithm);
                item.setKey(key);
                item.SetHashAlgorithm(_hashAlgorithm);
                return item;
            }
    
            public override AsymmetricSignatureFormatter CreateFormatter(AsymmetricAlgorithm key) {
                AsymmetricSignatureFormatter item = (AsymmetricSignatureFormatter) CryptoConfig.CreateFromName(FormatterAlgorithm);
                item.setKey(key);
                item.SetHashAlgorithm(_hashAlgorithm);
                return item;
            }
    
            private string _hashAlgorithm;
        }
    

    另一种可能性是,无论您如何验证签名,都不需要rsa-sha1(许多身份提供者通过配置禁止rsa-sha1)或者验证不正确。尝试在Okta或Salesforce等真实IdP注册并在那里进行验证。

     类似资料:
    • 我在Tomcat 7上使用Spring Security SAML 2.0示例webapp,并对其进行了修改,以尝试让其通过Ping身份验证服务。webapp正在与服务对话,并返回一个断言,但在尝试验证签名时失败,如下调试输出所示: 我知道它无法验证签名,并且我已经获得了ping身份管理员要使用的证书,但我不确定如何将其包含在应用程序中。我尝试过使用JDK的keytools程序将其添加到示例应用程

    • 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

    • 我是从IDP接收SAML断言签名的服务提供商。我在Tomcat上使用JOSSO来使用断言。这里的问题是我无法验证断言签名。 IDP证书使用别名“IDP”上传到我的密钥库。 在验证sig时,我得到以下错误: 为什么JOSSO无法检测密钥库中的证书并验证签名?我需要以不同的方式定义别名吗?

    • 我试图遵循以下规范来验证SAML响应的签名:https://www.w3.org/tr/xmldsig-core/#sec-pkcs1 下面是我的工作流程:我得到SAML响应。我去掉签名信封,我把它规范化,我检查摘要,然后我检查签名。我能够成功地计算转换的SAML响应的SHA1摘要,并对其进行验证。然而,RSA-SHA1签名检查仍然无法实现。 SAML响应包含签名方法算法:http://www.w

    • 我试图向google calendar api发出POST请求,但我不知道如何对其进行身份验证。 我采取了以下步骤尝试并使用服务帐户执行此操作: > <代码>{“error”:{“errors”:[{“domain”:“global”,“reason”:“authError”,“message”:“Invalid Credentials”,“locationType”:“header”,“loca

    • 请帮忙。我有一个 SP,以及一个用于远程 IDP 的公钥。我上传了 spring sam 的示例,并对其进行了更改,公钥被添加到带有别名的 jks 文件中(使用键工具,命令列表显示 cer 已导入),并且它指向带有签名键的 idp 扩展元数据。但最终验证失败了。 org.opensaml.ws.security.安全策略异常:协议消息签名验证失败