Статус: Новичок
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 02.04.2025(UTC) Сообщений: 2  Откуда: Москва
|
Проблема была решена использованием класса CMS и метода CMSSign(). Класс включен в библиотеку КриптоПро.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close