3

我正在尝试验证 xml 签名

<CanonicalizationMethod Algorithm="http://www.w3.org/TR/1999/WD-xml-c14n-19991115"/>

但我得到一个例外:

javax.xml.crypto.MarshalException: java.security.NoSuchAlgorithmException: no such algorithm: http://www.w3.org/TR/1999/WD-xml-c14n-19991115 for provider XMLDSig

我不喜欢更改 xml 输入的选项。看起来实现一些自定义规范化方法或强制 java 使用其他方法要好得多,但我不知道该怎么做。

final NodeList signatureNodeList = document.getElementsByTagName(SIGNATURE_TAG_NAME);
  if (signatureNodeList.getLength() == 0)
    return false;
  for(int i = 0; i < signatureNodeList.getLength(); i++){
    final DOMValidateContext validateContext = new DOMValidateContext(
      new KeyValueKeySelector(), signatureNodeList.item(i));
    final XMLSignature signature = xmlSignatureFactory.unmarshalXMLSignature(
      validateContext);
    if(!signature.validate(validateContext))
      return false;
  }
4

1 回答 1

1

这些是JDK 8 中CanonicalizationMethod定义的值:

具体来说,您正在使用的 1999 年工作草案 ( http://www.w3.org/TR/1999/WD-xml-c14n-19991115 ) 不在其中。

我不喜欢更改 xml 输入的选项。

从您的实现中,XMLDSigRI您可能可以弄清楚如何创建一个实现该特定版本的新提供者。

但是,我会认真考虑实施过时的草案是否有价值,尤其是在涉及密码学时。

于 2014-04-27T10:58:13.773 回答