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