gpt4 book ai didi

saml-2.0 - 构造签名的 SAML2 LogOut 请求

转载 作者:行者123 更新时间:2023-12-02 10:18:30 25 4
gpt4 key购买 nike

我的目标是实现单点注销协议(protocol)。首先,我了解该标准的工作原理以及如何将其适应我的场景:ADFS 2.0 作为 IdP,对我来说就像一个“黑匣子”

我现在正在做的事情是:

  1. 发送 <AuthnRequest>到我的 IdP

  2. IdP 要求我提供凭据,我提供了这些凭据并成功登录。

  3. 从 中获取 SessionIndex 值并构造 <LogoutRequest>

<samlp:LogoutRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="_135ad2fd-b275-4428-b5d6-3ac3361c3a7f" Version="2.0" Destination="https://idphost/adfs/ls/" IssueInstant="2008-06-03T12:59:57Z"><saml:Issuer>myhost</saml:Issuer><NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress" NameQualifier="https://idphost/adfs/ls/">myemail@mydomain.com</NameID<samlp:SessionIndex>_0628125f-7f95-42cc-ad8e-fde86ae90bbe</samlp:SessionIndex></samlp:LogoutRequest>

  1. 取上面的<LogoutRequest>并将其编码为 Base64

  2. 构造下一个字符串:SAMLRequest=base64encodedRequest&SigAlg=http%3A%2F%2Fwww.w3.org%2F2000%2F09%2Fxmldsig%23rsa-sha1

  3. 用上面的字符串生成签名

  4. 对签名进行 Base64 编码

  5. 发送请求:https://"https://idphost/adfs/ls/?SAMLRequest=base64encodedRequest&SigAlg=http%3A%2F%2Fwww.w3.org%2F2000%2F09%2Fxmldsig%23rsa-sha1&Signature=base64EncodedSignature

但是 IdP 正在回答我:SAML 消息签名验证失败。

为了进行签名,我使用我的私钥(2048 字节),为了验证,假定 IdP 使用我的公钥(我在注册主机时发送的公钥)

用于签署请求的代码如下所示:

// Retrieve the private key
KeyStore keyStore = KeyStore.getInstance("JKS", "SUN");
FileInputStream stream;
stream = new FileInputStream("/path/to/my/keystore.jks");
keyStore.load(stream, "storepass".toCharArray());
PrivateKey key = (PrivateKey) keyStore.getKey("keyAlias","keyPass".toCharArray());

// Create the signature
Signature signature = Signature.getInstance("SHA1withRSA");
signature.initSign(key);
signature.update("SAMLRequest=jVJda8IwFH2e4H8ofW%2BbVmvboGWCDApusDn2sBdJm1sNtEmXmw7x1y92KDrY2Ov5uueEzJG1TUfXaqd68wIfPaBxDm0jkQ7Mwu21pIqhQCpZC0hNRTfLxzWNfEI7rYyqVONeWf52METQRijpOsVq4W7JoSzjJJnWAEAmwLMMpmRG0jCrYJICIcR13kCjdSxcG%2BA6K9tQSGYGZG9MhzQIGrUT0uPw6VegpV%2FtA8ZrDBq0ZxB7KCQaJo2NICT1yMwjk9cwonFG4%2BTdzceju%2FmpOx3EOu8qYThgGJ3j5sE1fZE%2F2X3FynlQumXm9%2BGhHw6I4F49SCm0TDRLzjWgrXiKee5ZI2oB%2Bj%2Bj8qYX6GvFtdj1cPRryzPJ4Xh%2F2%2Fe736VvRzf2nn24wmoP%2BZbMojSM4tpL6iz2plFVeYyn4NUc0hmDjJQlfCf9cI5HZ%2Fjm4%2BRf&RelayState=null&SigAlg=http%3A%2F%2Fwww.w3.org%2F2000%2F09%2Fxmldsig%23rsa-sha1".getBytes());

String signatureBase64encodedString = (new BASE64Encoder()).encodeBuffer(signature.sign());

最佳答案

终于我找到了正确的食谱:

  1. 生成 SAMLRequest 值
  2. 对 SAMLRequest 值进行 Base64 编码
  3. 对 SAMLRequest 值进行 URL 编码
  4. 对 SigAlg 值进行 URL 编码: http://www.w3.org/2000/09/xmldsig#rsa-sha1
  5. 将算法签名 (SHA1withRSA) 与SAMLRequest=值&SigAlg=值
  6. 对生成的签名进行 URL 编码

我们可以使用 SAML 2.0 调试器执行步骤 2 和 3(https://rnd.feide.no/simplesaml/module.php/saml2debug/debug.php)。而对于URL编码使用经典的w3schools(http://www.w3schools.com/tags/ref_urlencode.asp)

警告!确保 ADFS2 中的依赖方算法设置为 SHA1!

最诚挚的问候,

路易斯

ps:现在我必须编写一点代码......

pps:您可以在这里找到代码:https://github.com/cerndb/wls-cern-sso/tree/master/saml2slo

关于saml-2.0 - 构造签名的 SAML2 LogOut 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8150096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com