如何使用Open SAML签署SAML响应?

时间:2017-02-23 21:22:58

标签: java saml-2.0 opensaml

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

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

有人可以帮我提供一个代码片段,以便使用公钥和私钥对该消息进行调用。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

中有更多信息

答案 2 :(得分:0)

对于opensaml3,请使用:

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