如何从 OpenSAML 中的签名 XML 字符串生成签名值

问题描述

我仅在 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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...