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 に答える