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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline nik7991243785  
#1 Оставлено : 30 августа 2024 г. 16:46:55(UTC)
nik7991243785

Статус: Новичок

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline Санчир Момолдаев  
#2 Оставлено : 30 августа 2024 г. 23:27:44(UTC)
Санчир Момолдаев

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

Группы: Модератор, Участники
Зарегистрирован: 03.12.2018(UTC)
Сообщений: 1,182
Российская Федерация

Сказал(а) «Спасибо»: 99 раз
Поблагодарили: 271 раз в 252 постах
Добрый день!

0x8009000D - NTE_NO_KEY
у keystore позовите aliases() и убедитесь что нужный алиас там есть.
Техническую поддержку оказываем тут
Наша база знаний
Offline nik7991243785  
#3 Оставлено : 2 сентября 2024 г. 14:25:14(UTC)
nik7991243785

Статус: Новичок

Группы: Участники
Зарегистрирован: 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
Offline Санчир Момолдаев  
#4 Оставлено : 2 сентября 2024 г. 21:03:38(UTC)
Санчир Момолдаев

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

Группы: Модератор, Участники
Зарегистрирован: 03.12.2018(UTC)
Сообщений: 1,182
Российская Федерация

Сказал(а) «Спасибо»: 99 раз
Поблагодарили: 271 раз в 252 постах
а провайдер КриптоПро CSP работоспособен?
Техническую поддержку оказываем тут
Наша база знаний
Offline nik7991243785  
#5 Оставлено : 4 сентября 2024 г. 11:26:24(UTC)
nik7991243785

Статус: Новичок

Группы: Участники
Зарегистрирован: 31.07.2024(UTC)
Сообщений: 6

Поблагодарили: 1 раз в 1 постах
Автор: Санчир Момолдаев Перейти к цитате
а провайдер КриптоПро CSP работоспособен?


Проблему решили, в докер-контейнере нужно давать полные права на файловую систему, КритоПро не подгружал сертификаты
Offline Санчир Момолдаев  
#6 Оставлено : 4 сентября 2024 г. 12:33:51(UTC)
Санчир Момолдаев

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

Группы: Модератор, Участники
Зарегистрирован: 03.12.2018(UTC)
Сообщений: 1,182
Российская Федерация

Сказал(а) «Спасибо»: 99 раз
Поблагодарили: 271 раз в 252 постах
как минимум rw на
/var/opt/cprocsp/{tmp,users,keys}
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.