Добрый день!
при попытке написать программу для подписи строки в формате base64, и получении открепленной подписи в формате base64, получилось нечто следующее
Код:
import static com.sign2.CMS_samples.CMS.createCMS;
String password = "123456";
String alias = "Alias_Name";
String content = "PE1lc3NhZ2V..1lc3NhZ2VDb250ZW50QmFzZT4=" // сами данные
// Грузим хранилище.
KeyStore keyStore = KeyStore.getInstance(JCP.HD_STORE_NAME);
keyStore.load(null, null);
// Получаем ключ и сертификат.
PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, password);
final Certificate certificate = keyStore.getCertificate(alias);
Signature signature = Signature.getInstance("CryptoProSignature_2012_256", "JCP"); // так работает, почему не понятно, это значение взято отсюда https://www.cryptopro.ru/forum2/default.aspx?g=posts&m=93435#post93435
//Signature.getInstance("GOST3410_2012_256", "JCP"); // так падает
signature.initSign(privateKey);
byte[] a = content.getBytes(StandardCharsets.UTF_8);
signature.update(a);
byte[] b = createCMS(a, signature.sign(), certificate, false);
content = Base64.getEncoder().encodeToString(b);
return content;
это работает, не правильно подписывает, так как при проверке подписи вот здесь:
https://dss.cryptopro.ru/Verify/Verify/ после нажатия кнопки "проверить" ошибка вот такая:
Подпись не действительна
Не удалось проверить подпись формата CMS. Ошибка: [Указан неправильный алгоритм]. Код: [0x80090008]. Не удалось извлечь время подписи из атрибута signingTime. В подписи с индексом [0] не найдены подписанные атрибуты.
Формат подписи CAdES Подпись в формате PKCS7
и далее
информация уже о сертификате, там правильные данные.
явно что то не так, нужно было наверное подставить что то вроде GOST3410_2012_256 , (взято
отсюда ) но на этом
Код:
Signature.getInstance("GOST3410_2012_256", "JCP");
программа падает
java.security.NoSuchAlgorithmException: no such algorithm: GOST3410_2012_256 for provider JCP
at sun.security.jca.GetInstance.getService(Unknown Source)
at sun.security.jca.GetInstance.getInstance(Unknown Source)
at java.security.Signature.getInstance(Unknown Source)
...
все осложняется тем, что jcp установлен на другой машине, с сертификатами, и отладиться очень сложно,
1) куда копать? подпись то ставится но какая то не полная. видно кому и кем выдан сертификат в подписи, однако проверка выдает ошибку
Подпись не действительна
Не удалось проверить подпись формата CMS. Ошибка: [Указан неправильный алгоритм]. Код: [0x80090008]. Не удалось извлечь время подписи из атрибута signingTime. В подписи с индексом [0] не найдены подписанные атрибуты.
есть пример нормальной подписи - так вот она определяется без этой ошибки, т.е. это я что то не так делаю.
2) вообще можно так делать, как я ? т.е:
Код:
import static com.sign2.CMS_samples.CMS.createCMS;
и потом из своего класса:
Код:
byte[] b = createCMS(a, signature.sign(), certificate, false);
как я привел пример выше, или нужно переписывать полностью пример из CMS.java или в моем случае нужно брать пример из какого то иного файла? Если да, то из какого?
3) и даже в таком случае, почему падает на строке Signature.getInstance("GOST3410_2012_256", "JCP");
с ошибкой java.security.NoSuchAlgorithmException: no such algorithm: GOST3410_2012_256 for provider JCP
это то ведь вообще должно работать....
версия jcp 2.0.39014
Отредактировано пользователем 14 ноября 2020 г. 15:18:45(UTC)
| Причина: упорядочил вопросы, и поздоровался