xmlの公開キーを使用したjavax.xml.crypto.dsig検証
-
10-10-2019 - |
質問
javax.xml.crypto.dsigを使用して、公開キーを指定せずにxmlsignatureを除外して検証するにはどうすればよいですか?公開鍵は署名されたXMLにあるように見えますが、私はそれを取得する方法を理解することはできません。
DOMValidateContext valContext = new DOMValidateContext(key,signatureNode);
XMLSignature signature = fac.unmarshalXMLSignature(valContext);
boolean coreValidity = signature.validate(valContext);
私が言うことができる限り、DomvalidateContextのキーではなく、キーズセレクターを渡す必要があります。ただし、キーズセレクターの実装方法を理解できません。
キーズセレクターの実装方法について私が見つけた唯一の例は次のとおりです。 http://download.oracle.com/javase/6/docs/technotes/guides/security/xmldsig/xmldigitalsignature.html
残念ながら、うまくいきません。その実装では、次のことを行いますが、KeyValue要素がないために常に失敗します(キーバリュー要素の代わりにorg.jcp.xml.dsig.internal.domx509data要素であるように見えます。それらからのキー)。
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から公開キーを取得したいだけです。
解決
if()条件を拡張して、xsがx509dataのインスタンスも次のようにチェックするキーバリューのインスタンスであるかどうかを確認するためにチェックしています。
else if (xs instanceof X509Data) {
for (Object data : ((X509Data) xs).getContent()) {
if (data instanceof X509Certificate) {
pk = ((X509Certificate) data).getPublicKey();
}
}
}
他のヒント
ビルドパスにxmldsig.jarを含めるだけで、1.5のjdkを1.5に追加する必要があります。http://java.sun.com/developer/technicalarticles/xml/dig_signature_api/