【问题标题】:How to add KeyInfo & X509Data under the Signature in SAML 2.0 using Java如何使用 Java 在 SAML 2.0 的签名下添加 KeyInfo 和 X509Data
【发布时间】:2015-10-02 21:07:50
【问题描述】:

我对 SAML 完全陌生,我只是构建了 saml,但根据要求,我还需要添加 KeyInfo 和 x509 证书节点,包括客户端的公共证书,我使用以下代码生成签名元素,但不知道如何添加 签名中的 KeyInfo 和 X509Data。需要这方面的帮助吗?

BasicX509Credential signingCredential = new BasicX509Credential();
    //Namespace nameSpaceSAML = new Namespace("http://www.w3.org/2000/09/xmldsig#","ds");
    KeyStore keyStore = getKeyStore( signingKeyStorePath,signingKeyStorePassword);
    PrivateKey privateKey = getPrivateKey(keyStore,signingKeyalias,signingKeyStorePassword );
    signingCredential.setPrivateKey(privateKey);
    signature = (Signature) Configuration.getBuilderFactory().getBuilder(Signature.DEFAULT_ELEMENT_NAME).buildObject(Signature.DEFAULT_ELEMENT_NAME);
    signature.setSigningCredential(signingCredential);
    signature.setSignatureAlgorithm(SignatureConstants.ALGO_ID_SIGNATURE_RSA_SHA1);
    signature.setCanonicalizationAlgorithm(SignatureConstants.ALGO_ID_C14N_EXCL_OMIT_COMMENTS); 

【问题讨论】:

    标签: java saml opensaml


    【解决方案1】:

    如果您想要更少的代码,可以使用签名助手类来执行此操作。

    X509KeyInfoGeneratorFactory x509Factory = new X509KeyInfoGeneratorFactory();
    x509Factory.setEmitEntityCertificate(true);
    x509Factory.setEmitEntityCertificateChain(true);
    x509Factory.setEmitX509IssuerSerial(true);
    x509Factory.setEmitX509SubjectName(true);
    
    Configuration.getGlobalSecurityConfiguration().getKeyInfoGeneratorManager().registerFactory("x509emitingKeyInfoGenerator", x509Factory);
    
    SecurityHelper.prepareSignatureParams(signature, SPCredentials.getCredential(), null,  "x509emitingKeyInfoGenerator");
    

    这会设置 KeyInfo、签名算法等。使用工厂的 setEmit 方法来设置应该添加到 KeyInfo 中的内容

    如需了解更多信息,请阅读my blog post on it。 我还写了一个book on OpenSAML,我在其中详细解释了签名和加密功能等。

    【讨论】:

    • 感谢@Stefan,它成功了。我也在寻找以下元素作为 的一部分,但无法获得有关它的任何信息。<X509IssuerSerial> <X509IssuerName>CN=VeriSign Class 3 Secure Server CA - G3, OU=Terms of use at https://www.verisign.com/rpa (c)10, OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US</X509IssuerName> <X509SerialNumber>147750819997667206557338217414016145916</X509SerialNumber> </X509IssuerSerial> 你能帮我如何添加这些附加元素吗?
    • 更新了答案。祝你好运!
    【解决方案2】:

    对于那些寻求答案的人,我想出了将 KayInfo 元素与 X509Data 一起添加的解决方案,如下所示,它工作正常......

    KeyInfo keyInfo=(KeyInfo)Configuration.getBuilderFactory().getBuilder(KeyInfo.DEFAULT_ELEMENT_NAME).buildObject(KeyInfo.DEFAULT_ELEMENT_NAME);
            X509Data data=(X509Data)Configuration.getBuilderFactory().getBuilder(X509Data.DEFAULT_ELEMENT_NAME).buildObject(X509Data.DEFAULT_ELEMENT_NAME);
            X509Certificate cert=(X509Certificate)Configuration.getBuilderFactory().getBuilder(X509Certificate.DEFAULT_ELEMENT_NAME).buildObject(X509Certificate.DEFAULT_ELEMENT_NAME);
            signature.setSigningCredential(signingCredential);
            value=org.apache.xml.security.utils.Base64.encode(signingCredential.getEntityCertificate().getEncoded());
            cert.setValue(value);
            data.getX509Certificates().add(cert);
            keyInfo.getX509Datas().add(data);
            signature.setKeyInfo(keyInfo);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 2023-01-23
      • 2022-10-23
      相关资源
      最近更新 更多