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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Скобелев Дмитрий  
#1 Оставлено : 23 мая 2021 г. 12:39:49(UTC)
Скобелев Дмитрий

Статус: Участник

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

Сказал(а) «Спасибо»: 1 раз
Пытаемся подписать хэш сообщения следующим кодом, тут проверку проходит.


Код:
fun signHashData(hashData: String, hashAlg: String): String? {
        Logger.log("Load key container to sign data.")
        // Тип контейнера по умолчанию.
        val keyStoreType: String = KeyStoreType.currentType()
        Logger.log("Default container type: $keyStoreType")

        // Загрузка ключа и сертификата.
        load(
            askPinInDialog, keyStoreType,
            currentAlias,
            null
        )
        if (privateKey == null) {
            Logger.log("Private key is null.")
            return null
        }

        // Формируем подпись.
        val chain = mutableListOf<X509Certificate>()

        if (certificates != null) {
            for (cert in certificates!!) {
                chain.add(cert as X509Certificate)
            }
        } else {
            chain.add(certificate!!)
        }
        var cAdESSignature = CAdESSignature(true, true) //Отсоединенная, подписываем хэш
        cAdESSignature.certificateStore =
            CollectionStore(mutableListOf(X509CertificateHolder(certificate!!.encoded)))
        Logger.log(
            "Single signature type: " +
                    if (cAdESType == CAdESType.CAdES_BES) "CAdES-BES" else "CAdES-X Long Type 1"
        )
        Logger.log(
            "Add one signer: " +
                    certificate!!.subjectDN+"\n public key Alg  "+certificate!!.publicKey.algorithm
        )

        if (cAdESType == CAdESType.CAdES_BES) {
            cAdESSignature.addSigner(
                JCSP.PROVIDER_NAME, null,
                null, privateKey, chain, cAdESType, null, false, null, null, null, true
            )
        }
        else {
            cAdESSignature.addSigner(
                JCSP.PROVIDER_NAME, null,
                null, privateKey, chain, cAdESType, CAdESSignVerifyPresenter.TSA_DEFAULT,
                false
            )
        }
        val signatureStream = ByteArrayOutputStream()
        Logger.log(
            "Compute signature for hash '" +
                    hashData + "\n" +
                    hashAlg
        )
        cAdESSignature.open(signatureStream)
        cAdESSignature.update(hashData.toByteArray()) //Возможно вот сюда нужно что-то другое вставлять?
        cAdESSignature.close()
        signatureStream.close()
        val sign = signatureStream.toByteArray()

        Logger.log(sign, true)
        Logger.log(sign.toString())

        // Проверяем подпись.
        Logger.log(
            "Verify CAdES signature of type: " +
                    if (cAdESType == CAdESType.CAdES_BES) "CAdES-BES" else "CAdES-X Long Type 1"
        )
        cAdESSignature = CAdESSignature(sign, hashData.toByteArray(), cAdESType, true)
        cAdESSignature.verify(chain)
        Logger.log("CAdES signature has been created and verified (OK)")
        return toBase64(sign)
    }


При попытке проверить через код
Код:

fun verify(
        dataInBase64: String?,
        signatureDataInBase64: String,
        isAttached: Boolean
    ): String {
        // Проверяем подпись.
        Logger.log(
            "Verify CAdES signature of type: " +
                    if (cAdESType == CAdESType.CAdES_BES) "CAdES-BES" else "CAdES-X Long Type 1"
        )
        val keyStoreType: String = KeyStoreType.currentType()

        load(
            askPinInDialog, keyStoreType,
            currentAlias,
            null
        )
        if (privateKey == null) {
            Logger.log("Private key is null.")
            return "null"
        }
        val chain = mutableListOf<X509Certificate>()
        if (certificates != null) {
            for (cert in certificates!!) {
                chain.add(cert as X509Certificate)
            }
        } else {
            chain.add(certificate!!)
        }
        val sign = signatureDataInBase64.replace("\n", "")
        val decodedSignature = Base64.getDecoder().decode(sign)
        val data =if (!isAttached) Base64.getDecoder().decode(dataInBase64) else null

        val cAdESSignature = CAdESSignature(decodedSignature, data, cAdESType)
        cAdESSignature.verify(chain)
        Logger.log("CAdES signature has been created and verified (OK)")
        return "true"
    }

подпись проверку не проходит. Так же не проходит проверку через инструменты КриптоПро - неверный хэш.
Не понятно как указать тип хэша для сертификата с открытым ключом ГОСТ Р 34.10-2012 256 бит (512 бит)
Как реализовать что-то подобное https://docs.cryptopro.r...-samples-cades-sign-hash
Просто отделенная подпись бинарных данных работает с тестовым сертификатом.
Код:
fun signData(dataInBase64: String, isAttached: Boolean): String? {
        Logger.log("Load key container to sign data.")
        // Тип контейнера по умолчанию.
        val keyStoreType: String = KeyStoreType.currentType()
        Logger.log("Default container type: $keyStoreType")

        // Загрузка ключа и сертификата.
        load(
            askPinInDialog, keyStoreType,
            currentAlias, null
        )
        if (privateKey == null) {
            Logger.log("Private key is null.")
            return null
        } // if

        // Формируем подпись.
        val chain = mutableListOf<X509Certificate>()
        val installedTrustCerts=InstallCAdESTestTrustCertExample(mcontext!!).getTrustCerts()
         //chain.add(installedTrustCerts.last())
        if (certificates != null) {
            for (cert in certificates!!) {
                chain.add(cert as X509Certificate)
            }
        } else {

            chain.add(certificate!!)
        }
        var cAdESSignature = CAdESSignature(!isAttached)
        cAdESSignature.certificateStore =
            CollectionStore(mutableListOf(X509CertificateHolder(certificate!!.encoded)))
        Logger.log(
            "Single signature type: " +
                    if (cAdESType == CAdESType.CAdES_BES) "CAdES-BES" else "CAdES-X Long Type 1"
        )
        Logger.log(
            "Add one signer: " +
                    certificate!!.subjectDN
        )
        if (cAdESType == CAdESType.CAdES_BES) {
            cAdESSignature.addSigner(
                JCSP.PROVIDER_NAME, null,
                null, privateKey, chain, cAdESType, null, false, null, null, null, true
            )
        }
        else {
            cAdESSignature.addSigner(
                JCSP.PROVIDER_NAME, null,
                null, privateKey, chain, cAdESType, CAdESSignVerifyPresenter.TSA_DEFAULT,
                false
            )
        }
        val signatureStream = ByteArrayOutputStream()
        Logger.log(
            "Compute signature for message '" +
                    dataInBase64 + "'"
        )
        cAdESSignature.open(signatureStream)
        val decodedBytes = Base64.getDecoder().decode(dataInBase64)
        cAdESSignature.update(decodedBytes)
        cAdESSignature.close()
        signatureStream.close()
        val sign = signatureStream.toByteArray()

        // Проверяем подпись.
        Logger.log(
            "Verify CAdES signature of type: " +
                    if (cAdESType == CAdESType.CAdES_BES) "CAdES-BES" else "CAdES-X Long Type 1"
        )
        val data= if (!isAttached) decodedBytes else null
        cAdESSignature = CAdESSignature(sign, data, cAdESType)
        cAdESSignature.verify(chain)
        Logger.log("CAdES подпись создана и проверена (OK)")
        return toBase64(sign)
    }



2. Попытка подписать бинарные данные действующим сертификатом info o sertifikate.txt (6kb) загружен 6 раз(а). приводит к ошибке, рутовые сертификаты устанавливаются при старте приложения root_certs.zip (3kb) загружен 4 раз(а).
Код:
I/JCP: ru.CryptoPro.JCP.pref.JCPPref.getBoolean :: System Preference Node: /ru/CryptoPro/reprov :: disable_tsp_cert_app_ext_checker = false
I/JCP: ru.CryptoPro.JCP.pref.JCPPref.getBoolean :: System Preference Node: /ru/CryptoPro/reprov :: disable_enroll_cert_type_ext_checker = false
W/System: A resource failed to call close. 
I/JCP: ru.CryptoPro.JCP.pref.JCPPref.getBoolean :: System Preference Node: /ru/CryptoPro/reprov :: disable_tsp_cert_app_ext_checker = false
I/JCP: ru.CryptoPro.JCP.pref.JCPPref.getBoolean :: System Preference Node: /ru/CryptoPro/reprov :: disable_enroll_cert_type_ext_checker = false
W/JCP: ru.CryptoPro.ssl.cl_39.<init> :: %% No appropriate keys for handshake
I/JCP: ru.CryptoPro.ssl.TrustManagerFactoryImpl.a :: trustStore is :  :: /data/user/0/ru.kck.signapp/security/cacerts
I/JCP: ru.CryptoPro.ssl.TrustManagerFactoryImpl.a :: trustStore type is :  :: BKS
I/JCP: ru.CryptoPro.ssl.TrustManagerFactoryImpl.a :: trustStore provider is :  :: 
I/JCP: ru.CryptoPro.ssl.TrustManagerFactoryImpl.a :: init truststore
W/JCP: ru.CryptoPro.ssl.pc_4.cl_4.<clinit> :: X.509 not found
    java.security.cert.CertificateException: X.509 not found
        at java.security.cert.CertificateFactory.getInstance(CertificateFactory.java:260)
******
Caused by: java.security.NoSuchAlgorithmException: The BC provider no longer provides an implementation for CertificateFactory.X.509.  Please see https://android-developers.googleblog.com/2018/03/cryptography-changes-in-android-p.html for more details.
        at sun.security.jca.Providers.checkBouncyCastleDeprecation(Providers.java:563)
        at sun.security.jca.Providers.checkBouncyCastleDeprecation(Providers.java:330)
        at java.security.cert.CertificateFactory.getInstance(CertificateFactory.java:254)
        	... 52 more
Validation failed for the target: 
    	serial: 43c3d60026adbe8449cb7479b2f73cc9
    	subject: SURNAME=Вавилова, GIVENNAME=Светлана Сергеевна, CN=ООО КСК ТЕХНОЛОГИИ, O=ООО КСК ТЕХНОЛОГИИ, L=Москва, ST=77 г. Москва, C=RU, EMAILADDRESS=s.vavilova@kck.ru, OID.1.2.643.3.131.1.1=#120C303037373138303634373937, OID.1.2.643.100.1=#120D31313537373436313231323436, OID.1.2.643.100.3=#120B3134383732313535343831
    	issuer: CN=Центральное информационно-техническое таможенное управление, O=Центральное информационно-техническое таможенное управление, STREET="ул. Новозаводская, д. 11/5", L=г. Москва, ST=77 Москва, C=RU, OID.1.2.643.3.131.1.1=#120C303037373330363534343731, OID.1.2.643.100.1=#120D31313137373436383839393431, EMAILADDRESS=vuc@ca.customs.ru
    	not before: Wed May 12 08:51:56 EDT 2021
    	not after: Fri Dec 31 07:51:56 EST 2021
    	signature provider: JCSP
    	validation date: null
    	revocation algorithm: CPPKIX
    	revocation validator: RevCheck
    	online: true
    For online validation by CRLDP parameter 'com.sun.security.enableCRLDP' (Oracle) or 'com.ibm.security.enableCRLDP' (IBM) must be set 'true' to enable or 'ocsp.enable' must be set 'true' (OCSP), or CRL passed for offline validation

Код:
System.setProperty("ru.CryptoPro.reprov.enableCRLDP", "true")
        System.setProperty("com.sun.security.enableCRLDP", "true")
        System.setProperty("com.ibm.security.enableCRLDP", "true")
        Security.setProperty("ocsp.enable", "true")

Отредактировано пользователем 23 мая 2021 г. 19:57:59(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#2 Оставлено : 24 мая 2021 г. 14:49:41(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Здравствуйте.
1. hashAlg - хеш от data на алгоритме хеширования, соответствующем алгоритму ключа privateKey?
2. Лог выглядит так, будто:
А) вы установили cpSSL.jar - для CAdES он не нужен;
Б) в CRLDP в сертификатах цепочки есть https-ссылка, а не http (или выполняется переадресация на https), и она, при попытке скачать CRL для проверки цепочки сертификатов, загружает cpSSL. В сертификате должна быть по крайней одна рабочая https-ссылка на CRL.
Если нельзя выполнить п.(Б), то попробуйте удалить cpSSL.
Offline Скобелев Дмитрий  
#3 Оставлено : 24 мая 2021 г. 17:58:26(UTC)
Скобелев Дмитрий

Статус: Участник

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

Сказал(а) «Спасибо»: 1 раз
1. Да Screenshot_1621867330.png (314kb) загружен 8 раз(а)..
После декодирования подписи
Screenshot_1621868176.png (262kb) загружен 3 раз(а). sign.txt (5kb) загружен 1 раз(а).
из Base64 данный хэш присутствует в подписи в неизменном виде
Screenshot_162186787412.png (120kb) загружен 7 раз(а).
2. https ссылок не вижу в сертификате. Некоторые ссылки не доступны. Удаление cpSSL.jar приводит к ошибке error_class_load.txt (4kb) загружен 2 раз(а)..
Отключение
Код:
Security.setProperty(
            "ssl.KeyManagerFactory.algorithm",
            ru.CryptoPro.ssl.Provider.KEYMANGER_ALG
        )
        Security.setProperty(
            "ssl.TrustManagerFactory.algorithm",
            ru.CryptoPro.ssl.Provider.KEYMANGER_ALG
        )
        Security.setProperty("ssl.SocketFactory.provider", "ru.CryptoPro.ssl.SSLSocketFactoryImpl")
        Security.setProperty(
            "ssl.ServerSocketFactory.provider",
            "ru.CryptoPro.ssl.SSLServerSocketFactoryImpl"
        )
        if (Security.getProvider(ru.CryptoPro.ssl.Provider.PROVIDER_NAME) == null) {
            Security.addProvider(ru.CryptoPro.ssl.Provider())
        } 
тоже не решает проблемы

Отредактировано пользователем 24 мая 2021 г. 17:59:19(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#4 Оставлено : 24 мая 2021 г. 21:22:07(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
На счет п.2 я погорячился. Скорее всего, есть переадресация с http на https. Для инициализации провайдера вы используете CSPConfig.init или CSPConfig.initEx?
Offline Скобелев Дмитрий  
#5 Оставлено : 25 мая 2021 г. 7:22:16(UTC)
Скобелев Дмитрий

Статус: Участник

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

Сказал(а) «Спасибо»: 1 раз
CSPConfig.initEx, но пробовал и CSPConfig.init. Некоторые ссылки не доступны видимо из-за того что доступ к ним только из локальной сети? Может быть что программа упирается в недоступный ресурс и выдает ошибку или она проходит по всему списку?
В логах не всегда есть java.security.NoSuchAlgorithmException: The BC provider no longer provides an implementation for CertificateFactory.X.509. иногда просто Validation failed for the target.
После изучения форума так и не понял как включить режим FINE в логах, Пробовал менять уровень логирования в криптопровайдере (ACSP.apk)
Offline Евгений Афанасьев  
#6 Оставлено : 25 мая 2021 г. 8:37:50(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Включите логирование так https://docs.cryptopro.r...d/additional_information :
adb shell setprop log.tag.JCP DEBUG
Соберите лог из adb logcat и приложите тут.
Offline Скобелев Дмитрий  
#7 Оставлено : 25 мая 2021 г. 11:27:48(UTC)
Скобелев Дмитрий

Статус: Участник

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

Сказал(а) «Спасибо»: 1 раз
Прикладываю log.txt (137kb) загружен 6 раз(а).. Насколько вижу по логу цепочка строится, причину ошибки так и не увидел:(
Offline Скобелев Дмитрий  
#8 Оставлено : 27 мая 2021 г. 9:34:42(UTC)
Скобелев Дмитрий

Статус: Участник

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

Сказал(а) «Спасибо»: 1 раз
Добавил в подпись список отозванных сертификатов crl.zip (150kb) загружен 2 раз(а).
Код:
val setCRL=getCRLsFromAssets()
        cAdESSignature.setCRLStore(CollectionStore(setCRL))
        Logger.log(
            "Add one signer: " +
                    certificate!!.subjectDN
        )
        if (cAdESType == CAdESType.CAdES_BES) {
            cAdESSignature.addSigner(
                JCSP.PROVIDER_NAME, null,
                null, privateKey, chain, cAdESType, null, false, null, null, setCRL, true
            )
        }

Код:
private fun getCRLsFromAssets(): Set<X509CRL?> {
        val result: MutableSet<X509CRL?> = HashSet()
        val cf: CertificateFactory = CertificateFactory.getInstance("X509")
        try {
            val assetManager = mcontext!!.assets
            val files = assetManager.list(CRL_CERTS_DIRECTORY)

            if (files != null) {
                for (path in files) {
                    var crl: X509CRL
                    val cert = assetManager.open(CRL_CERTS_DIRECTORY + File.separator + path)

                    try {
                        crl = cf.generateCRL(cert) as X509CRL
                        result.add(crl)
                    }catch (ex: CertificateException){
                        Logger.log(ex.localizedMessage)
                    } finally {
                        if (cert != null) {
                            try {
                                cert.close()
                            } catch (e: IOException) {
                            }
                        } // if
                    }

                }
            }
        } catch (e: java.lang.Exception) {
            throw java.lang.Exception("Failed to retrieve any certificates from the input file", e)
        }
        return result
    }


Пробовал включенными и отключенными параметрами
Код:
/*  System.setProperty("ru.CryptoPro.reprov.enableCRLDP", "true")
        System.setProperty("com.sun.security.enableCRLDP", "true")
        System.setProperty("com.ibm.security.enableCRLDP", "true")
        System.setProperty(
            "com.sun.security.enableAIAcaIssuers",
            "true"
        ) // для загрузки сертификатов по AIA из сети
        System.setProperty(
            "com.ibm.security.enableAIAcaIssuers",
            "true"
        ) // для загрузки сертификатов по AIA из сети
        System.setProperty(
            "ru.CryptoPro.reprov.enableAIAcaIssuers",
            "true"
        ) // для загрузки сертификатов по AIA из сети
        Security.setProperty("ocsp.enable", "true")
*/

Ничего не помогает

Отредактировано пользователем 27 мая 2021 г. 11:44:21(UTC)  | Причина: Не указана

Offline Скобелев Дмитрий  
#9 Оставлено : 27 мая 2021 г. 9:46:36(UTC)
Скобелев Дмитрий

Статус: Участник

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

Сказал(а) «Спасибо»: 1 раз
При попытке подписать этим сертификатом через интент тоже ошибка
Screenshot_1622098154.png (225kb) загружен 7 раз(а).
Screenshot_1622098250.png (229kb) загружен 7 раз(а).
Screenshot_1622098341.png (223kb) загружен 4 раз(а).
Screenshot_1622097680.png (73kb) загружен 7 раз(а).
log2.txt (143kb) загружен 0 раз(а).

Отредактировано пользователем 27 мая 2021 г. 9:53:19(UTC)  | Причина: Не указана

Offline Скобелев Дмитрий  
#10 Оставлено : 7 июня 2021 г. 9:03:23(UTC)
Скобелев Дмитрий

Статус: Участник

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

Сказал(а) «Спасибо»: 1 раз
1. С подписанием конкретным сертификатом разобрались, там в CRL был редирект на https. Сделали проверку и скачивание списка отозванных сертификатов в папку приложения с последующей подстановкой в процессе подписи.
Если этот список находится в локальном хранилище и не просрочен, то запрос к серверу не требуется и его можно отключить через параметры.
Но если список отозванных сертификатов в локальном хранилище просрочен, и при этом отключена возможность подключиться к серверу для скачивания актуального списка, возникает ошибка.

Исходя из этого, уточняющий вопрос: можно ли отключить проверку/использование списка просроченных сертификатов?

2. Пока не нашли ответа на начальный вопрос в ветке - как правильно подписать хэш https://docs.cryptopro.r...-samples-cades-sign-hash для андроид версии.

Отредактировано пользователем 7 июня 2021 г. 9:08:09(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.