Абсолютно та же ситуация (только на Java)
На локальной машине стоит:
CSP: КриптоПро CSP 4.0.9963 (Abel) от 23.11.2018
JCP: jcp-2.0.39852
По примеру из PKCS7Example.java (из архива jcp данной версии)
Сделал следующее
Код:
public static byte[] sign(String text, KeyStore keyStore, String alias, String password) throws Exception {
byte[] dataToSign = text.getBytes();
// Заменяем GOST-алгоритм
Utility.initJCPAlgorithms();
final List<Certificate> certificateChain = Arrays.asList(keyStore.getCertificateChain(alias));
// Конвертируем цепочку в X509Certificate.
final Collection<X509Certificate> chain = Arrays.asList(certificateChain.toArray(new X509Certificate[certificateChain.size()]));
// Сертификат подписи - первый в списке.
final X509Certificate signerCert = chain.iterator().next();
Store certStore = new JcaCertStore(chain);
final PrivateKey privateKey = (PrivateKey)keyStore.getKey(alias, password.toCharArray());
// Подготавливаем подпись.
CMSSignedDataGenerator generator = new CMSSignedDataGenerator();
ContentSigner contentSigner = new GostContentSignerProvider(privateKey, JCP.PROVIDER_NAME);
SignerInfoGenerator signerInfoGenerator = new JcaSignerInfoGeneratorBuilder(
new GostDigestCalculatorProvider(privateKey, JCP.PROVIDER_NAME)).build(contentSigner, signerCert);
generator.addSignerInfoGenerator(signerInfoGenerator);
generator.addCertificates(certStore);
// Создаем совмещенную подпись PKCS7.
CMSProcessable content = new CMSProcessableByteArray(dataToSign);
CMSSignedData signedData = generator.generate((CMSTypedData) content, false);
// Сформированная подпись.
byte[] pkcs7 = signedData.getEncoded();
// Сформированная подпись.
return pkcs7;
}
При этом точно также же переключаюсь на старый способ, использующий самоподписанный RSA - все работает.
Все остальные входные данные (способ формирования url, секрета, и тд) такиеже, меняется только способ генерации байт pkcs7 подписи. Которые потом кодируются Base64.getUrlEncoder().encodeToString(resultBytes).
Смотрел глазами результат в asn1 viewer`e - кажется всё окей. Туда кладутся 2 серта - пользовательский и УЦ (корневого не наблюдал, но его наверное и не должно быть). В подписи сформированной старым образом все примерно также (только алгоритмы другие и серты менее жирные чем боевые).
Также уточню что в CSP имортировал сертификаты ЦА и Корневой.
Пробовал на сертификатах/закрытых ключах как тестовых криптопро, так и на боевых от тензора. Пробовал только с тестовым ESIA.
В тех портале тестового загрузил серт. Переключил настройку "Алгоритм шифрования" на гост2012 (которая кажется ни на что не влияет, тк старый способ после этого продолжил работать).
Ошибка такая же как и у автора. И в прошлый раз когда протух тестовый сертификат - была такая же ошибка, которая пропала после перевода на новый серт. Так что дело точно в подписании.
esia-2012-pkcs7-failed.zip
(6kb) загружен 16 раз(а).Не понятно что не так.
Мб конечно в ЕСИА косяки с инфраструктурой или просто баги (не подгружены корневые серты, не работает гост2012 и тд), особенно учитывая что это тестовый.
Будем обращаться и к ним.
Но если кто-то сможет помочь - буду благодарен.
Приложу сформированный pkcs7, данные (строка) и серт если вдруг кто возьмется перепроверять.
esia-2012-pkcs7-failed.zip
(6kb) загружен 16 раз(а).Отредактировано пользователем 29 января 2020 г. 14:20:37(UTC)
| Причина: Не указана