5

javax.xml.crypto.dsig を使用して、公開鍵を指定せずに XMLSignature をアンマーシャリングして検証するにはどうすればよいですか? 公開鍵は署名済みの xml にあるようですが、それを取得する方法がわかりません。

DOMValidateContext valContext = new DOMValidateContext(key,signatureNode);
XMLSignature signature = fac.unmarshalXMLSignature(valContext);
boolean coreValidity = signature.validate(valContext);

私が知る限り、キーの代わりに KeySelector を DOMValidateContext に渡す必要があります。ただし、KeySelector の実装方法がわかりません。

KeySelector の実装方法について私が見つけた唯一の例を次に示し ます。

残念ながら、うまくいきません。その実装では、次のことを行いますが、KeyValue 要素がないため、常に失敗します (KeyValue 要素の代わりに、それらからの鍵)。

List list = keyInfo.getContent();

for (int i = 0; i < list.size(); i++) {
    XMLStructure xs = (XMLStructure) list.get(i);
    if(xs instanceof KeyValue) {
        PublicKey pk = null;
        try {
            pk = ((KeyValue) xs).getPublicKey();
        } catch (KeyException ke) {
            throw new KeySelectorException(ke);
        }
        // make sure algorithm is compatible with method
        if (algEquals(sm.getAlgorithm(), pk.getAlgorithm())) {
            return new SimpleKeySelectorResult(pk);
        }
    }
}
throw new KeySelectorException("No KeyValue element found!");

それで、これを行う方法はありますか?公開鍵がなくても xml ファイルの署名を検証できるようにしたいと考えています。XMLから公開鍵を取得したいだけです。

4

2 に答える 2

7

xs が KeyValue のインスタンスであるかどうかを確認するためにチェックしている if () 条件を拡張して、次のように X509Data のインスタンスもチェックします。

else if (xs instanceof X509Data) {
     for (Object data : ((X509Data) xs).getContent()) {
          if (data instanceof X509Certificate) {
              pk = ((X509Certificate) data).getPublicKey();
          }
     }
}
于 2011-03-10T19:18:49.720 に答える
1

xmldsig.jar をビルド パスにインクルードし、1.5 用の JDK をチェックします。1.6 用のビルド パスに追加する必要があります。組み込み済みなので、参照用に追加する必要はありません http://java.sun.com/developer /technicalArticles/xml/dig_signature_api/

于 2011-12-07T10:54:49.023 に答える