我必须在Java中实现与this类似的逻辑。
在发送给服务提供商之前,我有一个未签名的XML和消息。我有私钥和公钥以及无符号XML。
有人可以帮我提供一个代码片段,以便使用公钥和私钥对该消息进行调用。
答案 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);
中有更多信息
答案 2 :(得分:0)
对于opensaml3,请使用:
import org.opensaml.xmlsec.signature.support.Signer;