Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline dbubb  
#1 Оставлено : 26 марта 2021 г. 17:40:29(UTC)
dbubb

Статус: Активный участник

Группы: Участники
Зарегистрирован: 02.02.2011(UTC)
Сообщений: 43
Мужчина
Откуда: Екатеринбург

Сказал «Спасибо»: 14 раз
Поблагодарили: 1 раз в 1 постах
Добрый день.
Обновили в своем приложении версию JCP с 2.0.40502 до 2.0.41789
В приложении есть код, который делает проверку подписи, используя CAdES и bouncycastle.
С версией 2.0.40502 все работало.
Сначала обновили до 2.0.41789, оставив старые версии библиотек bouncycastle (1.50) - проверка подписи по прежнему работала.
Потом заметили что в dependencies у версии 2.0.41789 лежат более новые версии библиотек bouncycastle (1.60) - обновили и их.
И вот после этого проверка подписи сломалась, стала выдавать ошибку:
Цитата:
can't create content verifier: exception on setup: java.security.NoSuchAlgorithmException: no such algorithm: GOST3411-2012-256WITHECGOST3410-2012-256 for provider JCP


Код, делающий проверку примерно такой (убрал несущественные детали):
Код:

byte[] sign = new BASE64Decoder().decodeBuffer(sign_base64);
CMSSignedData signedData = new CMSSignedData(new CMSProcessableByteArray(signDate), sign);
Store<X509CertificateHolder> store = signedData.getCertificates();
SignerInformationStore signers = signedData.getSignerInfos();
Collection<SignerInformation> c = signers.getSigners();
Iterator<SignerInformation> it = c.iterator();
while (it.hasNext())
{
    SignerInformation signer = it.next();
    Collection<X509CertificateHolder> certCollection = store.getMatches(signer.getSID());
    Iterator<X509CertificateHolder> certIt = certCollection.iterator();
    X509CertificateHolder certHolder = certIt.next();
    X509Certificate cert = new JcaX509CertificateConverter().getCertificate(certHolder);
                
    JcaSignerInfoVerifierBuilder verifierBuilder =
            new JcaSignerInfoVerifierBuilder(new JcaDigestCalculatorProviderBuilder().build());
    verifierBuilder.setSignatureAlgorithmNameGenerator(new GostCMSSignatureAlgorithmNameGenerator());
    verifierBuilder.setSignatureAlgorithmFinder(new GostSignatureAlgorithmIdentifierFinder());
    SignerInformationVerifier signerInfoVerifier = verifierBuilder.setProvider(
            CAdESConfig.getDefaultDigestSignatureProvider()).build(cert.getPublicKey());

    signer.verify(signerInfoVerifier);
}


Вопросы:
1. Какую все-таки версию библиотек bouncycastle правильно использовать с JCP 2.0.41789?
В инсталляторе указано 1.50, в dependencies лежит 1.60. Подозреваю что в инсталляторе просто забыли поменять и нужна все-таки 1.60.
2. Почему тогда с этими библиотеками перестала работать проверка подписи, которая раньше работала, и что надо сделать чтобы она снова заработала?
Offline Евгений Афанасьев  
#2 Оставлено : 26 марта 2021 г. 22:03:22(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,910
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Здравствуйте.

Спасибо, что заметили неточности с номером версии в установщике, исправим на 1.60.

1. Нужна версия BC 1.60, как в dependencies.
2. В BC этой версии появилась поддержка ГОСТ 2012, поэтому возник конфликт.

Попробуйте поправить пример так, если проверять подпись с помощью JCP:
Код:

String provider = CAdESConfig.getDefaultDigestSignatureProvider(); // <-- !
byte[] sign = new BASE64Decoder().decodeBuffer(sign_base64);
CMSSignedData signedData = new CMSSignedData(new CMSProcessableByteArray(signDate), sign);
Store<X509CertificateHolder> store = signedData.getCertificates();
SignerInformationStore signers = signedData.getSignerInfos();
Collection<SignerInformation> c = signers.getSigners();
Iterator<SignerInformation> it = c.iterator();
while (it.hasNext())
{
    SignerInformation signer = it.next();
    Collection<X509CertificateHolder> certCollection = store.getMatches(signer.getSID());
    Iterator<X509CertificateHolder> certIt = certCollection.iterator();
    X509CertificateHolder certHolder = certIt.next();
    X509Certificate cert = new JcaX509CertificateConverter().getCertificate(certHolder);
                
    SignerInformationVerifier signerInfoVerifier = new SignerInformationVerifier( // <-- !
        new GostCMSSignatureAlgorithmNameGenerator(),
        new GostSignatureAlgorithmIdentifierFinder(),
        new GostContentVerifierProvider(cert, provider),
        new GostDigestCalculatorProvider(cert.getPublicKey(), provider)
    );

    signer.verify(signerInfoVerifier);
}
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
dbubb оставлено 29.03.2021(UTC)
Offline dbubb  
#3 Оставлено : 29 марта 2021 г. 15:01:24(UTC)
dbubb

Статус: Активный участник

Группы: Участники
Зарегистрирован: 02.02.2011(UTC)
Сообщений: 43
Мужчина
Откуда: Екатеринбург

Сказал «Спасибо»: 14 раз
Поблагодарили: 1 раз в 1 постах
Цитата:
Попробуйте поправить пример так, если проверять подпись с помощью JCP


Да, в таком виде сработало без ошибок, спасибо!
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.