java - 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);
解决方案
事实证明,实际上 XML 签名确实接受了这条曲线,我只是在比较错误的证书(ecdsa 证书与 RSA 证书)。
推荐阅读
- bash - 在没有 bc 的情况下比较 Unix 中的浮点数
- html - 无法在css动画中将文本保留在屏幕上
- angular - ExpressionChangedAfterItHasBeenCheckedError 从父更新子表单的验证器
- visual-studio - 如何从 github (VS 2019) 将多个解决方案文件添加到单个项目
- python - 如何在openpyxl中删除ConditionalFormattingList
- riscv - 如何在 RISC-V 中的 read_string 之后 print_string
- r - 如何将功能与值插入集成?
- typescript - react-native run-android 出现错误:评估项目':app'时出现问题。([androidx.appcompat:appcompat:1.1.0-rc01])
- c++ - 为什么在我的代码中调用复制构造函数而不是移动构造函数?
- windows - 每月在 Windows 上安排 Docker RUN 命令