问题描述
我仅在 SAML2.0 上尝试 IDP 发起的登录。我有一个 XML 字符串的 Signature 块,我需要使用 OpenSAML 生成 SignatureValue。
使用 Java 安全性我可以像下面那样做并能够返回生成的签名值,但是当我发送给服务提供商时,它正在发送 401-Unauthorized,我意识到我需要使用 OpenSAML 代替 Java 安全性包。
如何使用 OpenSAML 从以下 XML 生成 SignatureValue?
注意:我的 SOAP XML 没有任何 POJO 类。
签名块:
<?xml version="1.0" encoding="UTF-8"?>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<Reference URI="#Body-a23jlkasdjfo2urojsdklf">
<Transforms>
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<DigestValue>XXXXXXXXXXXXXXXXXXX</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue />
<KeyInfo>
<wsse:SecurityTokenReference xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:Reference ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" URI="#SecurityToken-a23jlkasdjfo2urojsdklf" />
</wsse:SecurityTokenReference>
</KeyInfo>
</Signature>
Java 代码:
public static String generateSignatureValue(String signatureMessage,String signatureAlgorithm,String privateKeyString)
throws Exception {
org.apache.xml.security.Init.init();
Canonicalizer canon = Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_EXCL_OMIT_COMMENTS);
byte[] canonXmlBytes = canon.canonicalize(signatureMessage.getBytes());
KeyFactory kf = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec keySpecPKCS8 = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKeyString));
PrivateKey privateKey = kf.generatePrivate(keySpecPKCS8);
java.security.Signature rsaSha1Signature = java.security.Signature.getInstance(signatureAlgorithm);
rsaSha1Signature.initSign(privateKey);
rsaSha1Signature.update(canonXmlBytes);
byte[] signed2 = rsaSha1Signature.sign();
return Base64.getEncoder().encodetoString(signed2);
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)