【问题标题】:How to Sign SAML Response using Open SAML?如何使用 Open SAML 签署 SAML 响应?
【发布时间】:2017-02-23 21:22:58
【问题描述】:

我必须在 Java 中实现与this 类似的逻辑。

在发送给服务提供商之前,我有一个未签名的 XML 和消息。我有私钥和公钥以及未签名的 XML。

谁能帮我提供一个代码 sn-p 确切地调用哪个方法来使用公钥和私钥对消息进行签名。

【问题讨论】:

  • 您使用哪个版本的 OpenSAML?

标签: java saml-2.0 opensaml


【解决方案1】:

您还可以使用来自Onelogin Saml Java 的 onelogin saml-java utils - 那个似乎更容易使用(它们具有从字符串加载公钥、私钥、文档等的方法。然后您可以使用它来签名要么是整个 SAML 响应,要么先签署断言,然后再签署响应:

Document document = Util.loadXML(saml); //loads string to document

//load private key and certificate
X509Certificate cert = Util.loadCert(pubKeyBytes);
PrivateKey privateKey = Util.loadPrivateKey(privKeyBytes);

//sign the response
String signedResponse = Util.addSign(document, privateKey, cert, null);

要使用这个库,只需添加

<dependency>
    <groupId>com.onelogin</groupId>
    <artifactId>java-saml</artifactId>
    <version>2.0.0</version>
</dependency>

对你项目的 pom.xml 的依赖

【讨论】:

    【解决方案2】:

    您创建一个签名对象并在其上设置签名属性

    signature.setSigningCredential(credential);
    signature.setSignatureAlgorithm(SignatureConstants.ALGO_ID_SIGNATURE_RSA_SHA1);
    signature.setCanonicalizationAlgorithm(SignatureConstants.ALGO_ID_C14N_EXCL_OMIT_COMMENTS);
    

    然后你在 Response 上设置签名对象

    .setSignature(signature)
    

    接下来你编组响应对象

    XMLObjectProviderRegistrySupport
       .getMarshallerFactory()
       .getMarshaller(response)
       .marshall(response);
    

    最后你使用 Signer 类来执行签名

    Signer.signObject(signature);
    

    我有更多信息在this post on my blog

    【讨论】:

    • 您应该对此答案给予更多支持。非常感谢您的澄清和博客文章。很棒的文章,我发现它很有用。
    【解决方案3】:

    对于opensaml3,使用:

    import org.opensaml.xmlsec.signature.support.Signer;
    

    【讨论】:

    • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 2014-09-20
    • 2021-10-28
    • 2015-01-21
    • 2021-10-16
    • 1970-01-01
    相关资源
    最近更新 更多