【发布时间】:2017-02-23 21:22:58
【问题描述】:
我必须在 Java 中实现与this 类似的逻辑。
在发送给服务提供商之前,我有一个未签名的 XML 和消息。我有私钥和公钥以及未签名的 XML。
谁能帮我提供一个代码 sn-p 确切地调用哪个方法来使用公钥和私钥对消息进行签名。
【问题讨论】:
-
您使用哪个版本的 OpenSAML?
我必须在 Java 中实现与this 类似的逻辑。
在发送给服务提供商之前,我有一个未签名的 XML 和消息。我有私钥和公钥以及未签名的 XML。
谁能帮我提供一个代码 sn-p 确切地调用哪个方法来使用公钥和私钥对消息进行签名。
【问题讨论】:
您还可以使用来自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 的依赖
【讨论】:
您创建一个签名对象并在其上设置签名属性
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
【讨论】:
对于opensaml3,使用:
import org.opensaml.xmlsec.signature.support.Signer;
【讨论】: