Добрый день! Пытаюсь получить подпись сертификата и его проверку с помощью jcp, но застрял на этапе создания подписи, поэтому буду признателен за любую помощь (руководство и примеры смотрел, но особого результата не дало)
Что имеется:1. Есть установленный контейнер с сертификатом "example_name" - команда: /opt/cprocsp/bin/amd64/certmgr -list, выводит его ссылка на ключ есть, код вывода: [ErrorCode: 0x00000000]
2. Для подписание файла используется команда: /opt/cprocsp/bin/amd64/cryptcp -signf -dir /user/sign -thumbprint 'value_123' -pin 'pin_123' -uMy -nochain -errchain /user/files/test.txt
test.txt
(1kb) загружен 3 раз(а). (файл прикреплен, там сломанная подпись, поменял часть символов, она как пример размера и формата подписи), в результате создается файл подписи: test.txt.sgn
mock_test.txt.sgn
(2kb) загружен 5 раз(а). (приложен сломанный файл, чтобы показать как выглядит формат подписи). Мета-информация о подписи: contentType ContentType OBJECT IDENTIFIER 1.2.840.113549.1.7.2 signedData (PKCS #7) , DigestAlgorithmIdentifier SEQUENCE (1 elem) algorithm OBJECT IDENTIFIER 1.2.643.7.1.1.2.2 gost2012Digest256 (GOST R 34.11-2012 256 bit digest) .
3. Для проверки подписи используется команда: /opt/cprocsp/bin/amd64/cryptcp -vsignf -dir /user/sign -thumbprint 'value_123' -uMy -nochain -errchain /user/files/test.txt . Вывод:
Цитата:Будет использован следующий сертификат:
Субъект: ... описание моего сертификата
Папка '/user/files/':
/user/files/test.txt... Проверка подписи...
Автор подписи: ... описание моего сертификата
Подпись проверена.
[ErrorCode: 0x00000000]
Что сделано с помощью кода:Цитата: System.setProperty("file.encoding", "UTF-8");
Security.addProvider(new JCP());
Security.addProvider(new RevCheck());
Security.addProvider(new CryptoProvider());
KeyStore keyStore = KeyStore.getInstance(JCP.HD_STORE_NAME,
JCP.PROVIDER_NAME);
keyStore.load(null, null);
final PrivateKey signerPrivateKey =
(PrivateKey) keyStore.getKey(ALIAS, "password".toCharArray());
final X509Certificate signerCert = (X509Certificate) keyStore.getCertificate(ALIAS);
Как с помощью этого получить аналогичную подпись и проверить - вопрос.
Что пробовал сделать:
1. данный код формировал котороткую подпись, которая не проходила валиацию через терминал.
Цитата:public static byte[] sign(String alghorithmName, PrivateKey privateKey,
byte[] data) throws Exception {
final Signature sig = Signature.getInstance(alghorithmName, JCP.PROVIDER_NAME);
sig.initSign(privateKey);
sig.update(data);
return sig.sign();
}
2. Создавал CAdESSignature, но там возникала ошибка:
Цитата:Caused by: ru.CryptoPro.AdES.exception.AdESException: Error occurred during building the certification path for the target:
serial: 263a82cb3f2981381ed11cc08e7487bbb
subject:
Код(получение ключа и сертификата аналогично коду выше) :
Цитата:
final List<X509Certificate> signerCertificateChain = Collections.singletonList(signerCert);
final CAdESSignature cadesSignature = new CAdESSignature(false);
//здесь возникает ошибка
cadesSignature.addSigner(
JCP.PROVIDER_NAME, // Имя провайдера, который будет использоваться для создания подписи.
JCP.GOST_DIGEST_NAME, // Идентификатор алгоритма хэширования, который будет использоваться для вычисления дайджеста (хэша) подписываемых данных.
JCP.GOST_EL_SIGN_NAME, // Идентификатор алгоритма подписи, который будет использоваться для создания электронной подписи.
signerPrivateKey, // Приватный ключ подписанта.
signerCertificateChain, // Цепочка сертификатов подписанта.
CAdESType.CAdES_BES, // Тип CAdES подписи.
null, // Адрес TSA службы.
false, // Заверяющая ли подпись.
null, // Таблица подписанных аттрибутов для добавления в подпись.
null, // Таблица неподписанных аттрибутов для добавления в подпись.
null, // CRL (списков отзыва сертификатов), связанных с подписью.
false // Добавить ли цепочку подписанта в подпись.
);
3. Пытался просто проверить подпись, но там возникает ошибка: Caused by: ru.CryptoPro.CAdES.exception.CAdESException: Certificate: sn 263a82cb3f2981381ed11cc08e7487bbb issued by GeneralNames:
... описание моего сертификата
not found
код:
Цитата: File file = new File("/user/files/test.txt");
File sign = new File("/user/sign/test.txt.sgn");
byte[] msg = FileUtils.readFileToByteArray(file);
byte[] bytes = Base64.decodeBase64(FileUtils.readFileToString(sign));
CAdESSignature cAdESSignature = new CAdESSignature(bytes, msg, null);
cAdESSignature.verify(null);