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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Виталий86  
#1 Оставлено : 9 апреля 2025 г. 11:17:24(UTC)
Виталий86

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

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

Сказал(а) «Спасибо»: 2 раз
Добрый день! Получаем в запросе подпись CAdES-BES, для верификации передаем открытый ключ. Ключ отправителя, которым сгенерирована подпись, выпущен в удостоверяющем центре ФНС России. КриптоПро JCP при проверке идет загружать через сеть список отозванных сертификатов, а для этого УЦ список отзыва огромный, весит 30Мб. Вследствие этого, столкнулись с проблемой что время обработки запроса критически возросло и занимает почти 20 секунд.

Я читал что в КриптоПро JCP есть какой-то механизм кэширования CRL, но в нашем случае при каждой проверке почему-то идет загружать по новой. Кроме того, пробовал реализовать оффлайн проверку CRL, предварительно загрузив и подложив его в формате файла - таким образом памяти JVM занимет даже больше и по времени работает тоже далеко не быстро + почему-то работает через раз, а через раз появляются разные непонятные ошибки при парсинге файла crl.

Вопрос какие есть способы побороть пробелму с долгой проверкой crl? Как корректно настроить механизм кэширования CRL? Можно ли добиться быстрой оффлайн проверки?

Мой код проверки подписи:

Код:

override fun verify(data: String, signatureBase64: String, publicKeyAlias: String) =
        try {
            val source: ByteArray = data.toByteArray(Charset.forName("UTF-8"))

            val byteSign = Base64.getDecoder().decode(signatureBase64)

            val openCertChain = openCertificates[publicKeyAlias]
                ?: throw IllegalArgumentException("Не найден открытый ключ для systemId $publicKeyAlias")

            val signerCertificateChain = openCertChain.toSet()

            //загруженный crl для случая когда отключена онлайн проверка crl
            val crlCertificateSet = mutableSetOf<X509CRL>()
            if (crlCertificate != null) {
                crlCertificateSet.add(crlCertificate)
            }

            val cadesSignature = CAdESSignature(
                byteSign, source,
                CAdESType.CAdES_BES, false
            )
            cadesSignature.verify(signerCertificateChain, crlCertificateSet)
            Pair(true, openCertChain[0].serialNumber.toString(16).uppercase())
        } catch (e: Exception) {
            logger.error("Произошла ошибка при проверке подписи запроса. Msg: ", e)
            Pair(false, null)
        }

@Bean
fun crlCertificate() = if (signProperties.crlCertificate.isBlank()) {
    null
} else {
    val certificateFactoryCrl = CertificateFactory.getInstance("X.509")
    val fileCrl = FileInputStream(signProperties.crlCertificate)
    val crlCertificate = certificateFactoryCrl.generateCRL(fileCrl) as X509CRL
    logger.debug {"Загружен список отзывов $crlCertificate"}
    crlCertificate
}

@Bean
fun openCertificates(): Map<String, List<X509Certificate>> {
    val certificates = mutableMapOf<String, List<X509Certificate>>()
    signProperties.publicKeys.forEach { (key, fileName) ->
        val certificateChain = loadCertificateChain(fileName)
        logger.debug {"Загружен открытый ключ $key: $certificateChain"}
        certificates[key] = certificateChain
    }
    return certificates
}



UPD, приложил логи
Код:

Apr 8, 2025 @ 17:46:03.605	CrlRevocationChecker.verifyRevocationStatus cert SN:  "номер сертификата"
Apr 8, 2025 @ 17:46:03.606	Connecting: http://pki.tax.gov.ru/cdp/d156fb382c4c55ad7eb3ae0ac66749577f87e116.crl
Apr 8, 2025 @ 17:46:03.606	CertStore URI: http://pki.tax.gov.ru/cdp/d156fb382c4c55ad7eb3ae0ac66749577f87e116.crl
Apr 8, 2025 @ 17:46:04.051	Downloading new CRL...
Apr 8, 2025 @ 17:46:13.673	RETURN
Apr 8, 2025 @ 17:46:13.673	ENTRY
Apr 8, 2025 @ 17:46:14.828	ENTRY
Apr 8, 2025 @ 17:46:14.830	RETURN
Apr 8, 2025 @ 17:46:14.853	Returning 1 CRLs
Apr 8, 2025 @ 17:46:14.875	CrlRevocationChecker.verifyRevocationStatus() approved crls.size() = 1
Apr 8, 2025 @ 17:46:14.875	CrlRevocationChecker.verifyRevocationStatus() crls.size() = 0
Apr 8, 2025 @ 17:46:14.876	*msVerify
Apr 8, 2025 @ 17:46:14.876	starting the final sweep...
Apr 8, 2025 @ 17:46:14.876	*rfcVerify
Apr 8, 2025 @ 17:46:14.876	CrlRevocationChecker.verifyRevocationStatus cert SN:  "номер сертификата"
Apr 8, 2025 @ 17:46:14.876	*ms =  131,074
Apr 8, 2025 @ 17:46:18.988	*ok
Apr 8, 2025 @ 17:46:18.989	***ok
Apr 8, 2025 @ 17:46:18.989	RETURN
Apr 8, 2025 @ 17:46:18.989	RETURN
Apr 8, 2025 @ 17:46:18.989	Certificate chain is valid.

Отредактировано пользователем 9 апреля 2025 г. 12:29:05(UTC)  | Причина: upd

Online Евгений Афанасьев  
#2 Оставлено : 12 апреля 2025 г. 20:07:11(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,017
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 721 раз в 680 постах
Здравствуйте.

1. Попробуйте с максимально новой версией JCP с сайта, по части CRL делались доработки.
2. Если замедление останется, то
"через раз появляются разные непонятные ошибки при парсинге файла crl...Можно ли добиться быстрой оффлайн проверки?" - приведите ошибки.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.