Мы осуществляем XML подписывание и проверку подписи. Первая часть выполнена, но при проверке подписи, которую мы получаем, есть одна проблема.
<Signature xmlns="****************">
<SignedInfo>
<CanonicalizationMethod Algorithm="****************"/>
<SignatureMethod Algorithm="****************"/>
<Reference URI="">
<Transforms>
<Transform Algorithm="****************"/>
</Transforms>
<DigestMethod Algorithm="****************"/>
<DigestValue>****************</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>****************</SignatureValue>
<KeyInfo>
<KeyName>3B1F************************************</KeyName>
</KeyInfo>
</Signature>
Коротко: есть ключевая информация с именем ключа, которое является SHA1 сертификата publi c, который мы должны подтвердить с. Я добавляю сертификат в хранилище доверенных сертификатов JKS с помощью keytool, и он генерирует отпечаток SHA1, именно то, что я получаю в подписи, которую я должен проверить, но как найти правильный сертификат по этому отпечатку в java? Я реализую KeySelector и фрагмент кода там (не работает):
public KeySelectorResult select(KeyInfo keyInfo, KeySelector.Purpose purpose,
AlgorithmMethod method, XMLCryptoContext context) throws KeySelectorException {
if (keyInfo == null) {
throw new KeySelectorException("Null KeyInfo object!");
}
SignatureMethod sm = (SignatureMethod) method;
List list = keyInfo.getContent();
for (int i = 0; i < list.size(); i++) {
XMLStructure xmlStructure = (XMLStructure) list.get(i);
if (xmlStructure instanceof KeyName) {
try {
Certificate certificate = keyStore.getCertificate(((KeyName) xmlStructure).getName());
PublicKey pk = certificate.getPublicKey();
if (algEquals(sm.getAlgorithm(), pk.getAlgorithm())) {
return new SimpleKeySelectorResult(pk);
}
} catch (KeyStoreException kse) {
throw new KeySelectorException(kse);
}
}
}
throw new KeySelectorException("No KeyValue element found!");
}
Этот код выше находит сертификат по его псевдониму, но мне нужен его отпечаток SHA1. Любая помощь будет оценена. Заранее спасибо.