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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline shedever  
#1 Оставлено : 2 апреля 2025 г. 12:48:45(UTC)
shedever

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

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

Добрый день!
Нужна помощь с подписанием документов. Есть задача на создание системы, в которой будет интеграция с ИС "Госключ". Для интеграции запросил сертификат и ключи. Написал код:
Код:
@Service
public class SigningService {

    private final String signAlgorithm = JCP.GOST_SIGN_2012_256_NAME;
    @Value("${KEYNAME}")
    private String KEYNAME;
    @Value("${KEYPASS}")
    private char[] KEYPASS;

    static {
        Security.addProvider(new JCP());
    }

    /**
     * Инициализация KeyStore
     *
     * @return KeyStore
     * @throws KeyStoreException        Не найдено хранилище
     * @throws NoSuchProviderException  Не найден провайдер
     * @throws CertificateException     Не найден сертификат
     * @throws IOException              Ошибка ввода вывода
     * @throws NoSuchAlgorithmException Не найден алгоритм
     */
    private KeyStore initKeyStore() throws KeyStoreException, NoSuchProviderException, CertificateException, IOException, NoSuchAlgorithmException {
        KeyStore keyStore = KeyStore.getInstance(JCP.HD_STORE_NAME, JCP.PROVIDER_NAME);
        keyStore.load(null, null);

        return keyStore;
    }

    /**
     * Получение приватного ключа из хранилища
     *
     * @param keyStore KeyStore
     * @return PrivateKey
     * @throws UnrecoverableKeyException Не найден ключ
     * @throws KeyStoreException         Не найдено хранилище
     * @throws NoSuchAlgorithmException  Не найден алгоритм
     */
    private PrivateKey getPrivateKey(KeyStore keyStore) throws UnrecoverableKeyException, KeyStoreException, NoSuchAlgorithmException {
        return (PrivateKey) keyStore.getKey(
                KEYNAME,
                KEYPASS
        );
    }

    /**
     * Получение приватного ключа из хранилища
     *
     * @param keyStore KeyStore
     * @return PublicKey
     * @throws KeyStoreException Не найдено хранилище
     */
    private PublicKey getPublicKey(KeyStore keyStore) throws KeyStoreException {
        return keyStore.getCertificate(KEYNAME).getPublicKey();
    }

    /**
     * Инициализация Signature
     * @param privateKey Приватный ключ
     * @return Signature
     * @throws NoSuchAlgorithmException Не найден алгоритм
     * @throws InvalidKeyException Неправильный ключ
     */
    private Signature initSignature(PrivateKey privateKey) throws NoSuchAlgorithmException, InvalidKeyException {
        Signature signature = Signature.getInstance(signAlgorithm);
        signature.initSign(privateKey);

        return signature;
    }

    /**
     * Инициализация Signature
     * @param publicKey Приватный ключ
     * @return Signature
     * @throws NoSuchAlgorithmException Не найден алгоритм
     * @throws InvalidKeyException Неправильный ключ
     */
    private Signature initVerify(PublicKey publicKey) throws NoSuchAlgorithmException, InvalidKeyException {
        Signature signature = Signature.getInstance(signAlgorithm);
        signature.initVerify(publicKey);

        return signature;
    }

    /**
     * Метод подписывает документ
     *
     * @param documentBytes Документ
     * @return ЭЦП
     * @throws InvalidKeyException       Неправильный ключ
     * @throws SignatureException        Ошибка
     * @throws NoSuchAlgorithmException  Не найден алгоритм
     * @throws KeyStoreException         Не найдено хранилище
     * @throws NoSuchProviderException   Не найден провайдер
     * @throws UnrecoverableKeyException Не найден ключ
     * @throws CertificateException      Не найден сертификат
     * @throws IOException               Ошибка ввода вывода
     */
    public byte[] signDocument(
            byte[] documentBytes
    )
            throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, KeyStoreException,
            NoSuchProviderException, UnrecoverableKeyException, CertificateException, IOException {

        KeyStore keyStore = initKeyStore();
        PrivateKey privateKey = getPrivateKey(keyStore);
        Signature signature = initSignature(privateKey);

        signature.update(documentBytes);

        return signature.sign();
    }

    /**
     * Метод подписывает документ
     *
     * @param sign Документ
     * @return Соответствие подписи
     * @throws InvalidKeyException       Неправильный ключ
     * @throws SignatureException        Ошибка
     * @throws NoSuchAlgorithmException  Не найден алгоритм
     * @throws KeyStoreException         Не найдено хранилище
     * @throws NoSuchProviderException   Не найден провайдер
     * @throws CertificateException      Не найден сертификат
     * @throws IOException               Ошибка ввода вывода
     */
    public boolean verify(
            byte[] sign
    ) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, KeyStoreException,
            NoSuchProviderException, CertificateException, IOException {
        Security.addProvider(new JCP());

        KeyStore keyStore = initKeyStore();
        PublicKey publicKey = getPublicKey(keyStore);
        Signature signature = initVerify(publicKey);

        return signature.verify(sign);
    }
}


Документы подписывает и верификацию в обратную сторону проходит, однако когда пытаюсь проверить подпись тут (https://e-trust.gosuslugi.ru/check/sign), то получаю ответ, что нет подписи под файлом.
На текущий момент пользуюсь предварительной несертифицированной версии КриптоПро JCP и JTLS R5 2.0.45042-A для java 11 и выше. Запускаю код по JDK 21 в docker контейнере debian.
Не подскажете, что я делаю не так или чего может не хватать для подтверждения подписи на данном ресурсе?

Отредактировано пользователем 2 апреля 2025 г. 13:15:04(UTC)  | Причина: Не указана

Wanna join the discussion?! Login to your Форум КриптоПро forum account. Новые регистрации запрещены.

Offline shedever  
#2 Оставлено : 2 апреля 2025 г. 15:43:13(UTC)
shedever

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

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

Проблема была решена использованием класса CMS и метода CMSSign(). Класс включен в библиотеку КриптоПро.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.