Статус: Новичок
Группы: Участники
Зарегистрирован: 31.07.2024(UTC) Сообщений: 6
Поблагодарили: 1 раз в 1 постах
|
Добрый день! Получаю ошибку "ru.CryptoPro.JCSP.MSCAPI.MSHashNSignException: Hash or Sign ERROR: 0x8009000d" при подписании документа в докер контейнере, на локальной машине подписание проходит успешно. Подписи при проверке на сайте - валидные. Версия Java CSP 5.0.45549-A и Crypto-Pro CSP 5.0.13000 совпадает на локальной машине и в докер. В контейнер были догружены корневые сертификаты СКБ Контур преобразованные в формат pem Пример кода для формирования подписи: Код:public File sign(File document, String containerName, byte[] pfxFile) {
try {
var keyStore = KeyStore.getInstance(JCSP.PFX_STORE_NAME, JCSP.PROVIDER_NAME);
keyStore.load(new ByteArrayInputStream(pfxFile), containerPassword.toCharArray());
var alias = findAlias(keyStore, containerName);
JCPProtectionParameter parameter = new JCPProtectionParameter(containerPassword.toCharArray());
JCPPrivateKeyEntry entry = (JCPPrivateKeyEntry) keyStore.getEntry(alias, parameter);
var certificates = getX509Certificates(keyStore.getCertificateChain(alias));
byte[] data = getRawDigest(document);
byte[] signature = createCAdESBES(entry.getPrivateKey(), certificates, data);
var signatureFile = new File(document.getPath().replaceAll(".xml", ".sgn"));
try (FileOutputStream outputStream = new FileOutputStream(signatureFile)) {
outputStream.write(signature);
}
return signatureFile;
} catch (ServiceException se) {
throw se;
} catch (Exception e) {
log.error("Ошибка при подписании документа: {}", e.getMessage());
throw new ServiceException(ErrorType.CRYPTO_PRO_ERROR, "Не удалось подписать документ");
}
}
private byte[] createCAdESBES(PrivateKey privateKey, List<X509Certificate> chain, byte[] data) throws Exception {
CAdESSignature cadesSignature = new CAdESSignature(true, true);
cadesSignature.addSigner(
JCSP.PROVIDER_NAME,
null,
null,
privateKey,
chain,
CAdESType.CAdES_BES,
null,
false,
null,
null,
null,
// Добавляем цепочку сертификатов в подпись
true
);
try (ByteArrayOutputStream signatureStream = new ByteArrayOutputStream()) {
cadesSignature.open(signatureStream);
cadesSignature.update(data);
cadesSignature.close();
return signatureStream.toByteArray();
}
}
private byte[] getRawDigest(File document) throws Exception {
var md = MessageDigest.getInstance(JCP.GOST_DIGEST_2012_256_NAME, JCSP.PROVIDER_NAME);
return md.digest(FileUtils.readFileToByteArray(document));
}
private String findAlias(KeyStore keyStore, String containerName) throws KeyStoreException {
var aliases = keyStore.aliases();
while (aliases.hasMoreElements()) {
String alias = aliases.nextElement();
if (alias.equals(containerName)) {
return alias;
}
}
return null;
}
private List<X509Certificate> getX509Certificates(Certificate[] chain) {
List<X509Certificate> result = new ArrayList<>();
for (Certificate cert : chain) {
result.add((X509Certificate) cert);
}
return result;
}
}
Отредактировано пользователем 30 августа 2024 г. 16:52:47(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,182 Сказал(а) «Спасибо»: 99 раз Поблагодарили: 271 раз в 252 постах
|
Добрый день!
0x8009000D - NTE_NO_KEY у keystore позовите aliases() и убедитесь что нужный алиас там есть. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 31.07.2024(UTC) Сообщений: 6
Поблагодарили: 1 раз в 1 постах
|
Автор: Санчир Момолдаев Добрый день!
0x8009000D - NTE_NO_KEY у keystore позовите aliases() и убедитесь что нужный алиас там есть. Алиасы есть контейнере При подписании в логах ошибка: ru.CryptoPro.AdES.exception.AdESException: CertOpen*Store* failed, store name: CA, error: 0x8009001d ru.CryptoPro.AdES.exception.AdESException: CertOpen*Store* failed, store name: ROOT, error: 0x8009001d
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,182 Сказал(а) «Спасибо»: 99 раз Поблагодарили: 271 раз в 252 постах
|
а провайдер КриптоПро CSP работоспособен? |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 31.07.2024(UTC) Сообщений: 6
Поблагодарили: 1 раз в 1 постах
|
Автор: Санчир Момолдаев а провайдер КриптоПро CSP работоспособен? Проблему решили, в докер-контейнере нужно давать полные права на файловую систему, КритоПро не подгружал сертификаты
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,182 Сказал(а) «Спасибо»: 99 раз Поблагодарили: 271 раз в 252 постах
|
как минимум rw на /var/opt/cprocsp/{tmp,users,keys} |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close