Получить ключ по отпечатку пальца в java - PullRequest
0 голосов
/ 22 января 2020

Мы осуществляем 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. Любая помощь будет оценена. Заранее спасибо.

...