首页 > 解决方案 > XMLSignature 默认为 RSA,如何验证 SSL 签名的 DSA 曲线?

问题描述

我正在编写 java 代码来获取一个规范化的 XML 文件,该文件由批准方的 SSL 密钥签名。

如果签名者使用 RSA 密钥,我可以从文件中获取内容和签名,甚至可以验证签名。

但是,如果使用 DSA 密钥创建 SSL 签名,则 XMLSignature 对象将失败并出现以下错误:

javax.xml.crypto.dsig.XMLSignatureException:java.security.InvalidKeyException:没有安装的提供程序支持此密钥:sun.security.rsa.RSAPublicKeyImpl

我的代码如下:

    SignatureCheck result = new SignatureCheck();
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    dbFactory.setNamespaceAware(true);
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
    Document xml = dBuilder.parse(fileStream);
    xml.getDocumentElement().normalize();

    // Find Signature element
    NodeList nl = xml.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");
    if (nl.getLength() == 0) return result;

    // Create a DOM XMLSignatureFactory that will be used to unmarshal the
    // document containing the XMLSignature
    XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");

    // Create a DOMValidateContext and specify a KeyValue KeySelector
    // and document context
    DOMValidateContext valContext = new DOMValidateContext(new CertKeySelector(), nl.item(0));

    // unmarshal the XMLSignature
    XMLSignature signature = fac.unmarshalXMLSignature(valContext);

    // Validate the XMLSignature (generated above)
    result.isValid = signature.validate(valContext);

标签: javaxmlcryptography

解决方案


事实证明,实际上 XML 签名确实接受了这条曲线,我只是在比较错误的证书(ecdsa 证书与 RSA 证书)。


推荐阅读