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

Уведомление

Icon
Error

4 Страницы«<234
Опции
К последнему сообщению К первому непрочитанному
Offline Александр Лавник  
#31 Оставлено : 7 июля 2020 г. 16:33:51(UTC)
Александр Лавник

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

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

Сказал «Спасибо»: 53 раз
Поблагодарили: 773 раз в 715 постах
Уточнил у разработчиков gostengy.

Работать будет только с:

Код:
user root;


Как вариант можете попробовать запускать внешний nginx от root и ставить proxy_pass на внутренний nginx, который без TLS от www-data.

То есть запускать 2 nginx.

Первый будет работать под пользователем root и обслуживать 443 порт.

Будет принимать соединение и proxy_pass-ить на 2-ой запущенный nginx, который обслуживает только 80 (или любой другой порт) без использования TLS.
Техническую поддержку оказываем тут
Наша база знаний
thanks 2 пользователей поблагодарили Александр Лавник за этот пост.
Санчир Момолдаев оставлено 07.07.2020(UTC), UArtX оставлено 07.07.2020(UTC)
Offline maslito  
#32 Оставлено : 10 ноября 2020 г. 13:51:13(UTC)
maslito

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

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

Сказал(а) «Спасибо»: 3 раз
столкнулся с такой же ошибкой.
Контейнер есть, сертикификат есть.

Код:
root@8790fe2960e3:/opt/cprocsp/src/samples/CSP# /opt/cprocsp/bin/amd64/certmgr -list


Код:
Certmgr 1.1 (c) "Crypto-Pro", 2007-2020.
Program for managing certificates, CRLs and stores.
=============================================================================
1-------
Issuer              : T=Администратор, OU=Удостоверяющий и ключевой центр, O=Тестовый УЦ ИнфоТеКС, CN=Администратор Тестового УЦ ИнфоТеКС
Subject             : OGRN=1027806071930, INN=7811129343, CN=test8
Serial              : 0x01D6A92B997FDD700000001400050001
SHA1 Hash           : f8154bc5aafc2063b93a3d172f5d758c57d5599b
SubjKeyID           : 8f7e71b63882f5c69eb0a385227f9671e6da32bb
Signature Algorithm : ГОСТ Р 34.11-2012/34.10-2012 256 бит
PublicKey Algorithm : ГОСТ Р 34.10-2012 (512 bits)
Not valid before    : 23/10/2020  10:59:00 UTC
Not valid after     : 14/12/2020  20:59:59 UTC
PrivateKey Link     : Yes                
Container           : HDIMAGE\\test8.000\76A4
Provider Name       : Crypto-Pro GOST R 34.10-2012 KC1 CSP


Пытаюсь зашифровать по ГОСТ 28147-89, есть код на С

Код:

...
// генерация эфемерной ключевой пары
    if(!CryptGenKey(hProv, /* CALG_DH_EL_EPHEM */ CALG_DH_GR3410_12_256_EPHEM, CRYPT_EXPORTABLE, &hEphemeralKey)) HandleError("Error during CryptGenKey Ephemeral key.");
#ifdef DEBUG_OUT
    printf("03. The Ephemeral key has been acquired. \n");
#endif
    // экспорт открытого ключа отправителя в BLOB
    if(!CryptExportKey(hEphemeralKey, 0, PUBLICKEYBLOB, 0, pbSenderPublicKeyBlob, &dwSenderPublicBlobLen)) HandleError("Error during CryptExportKey of Sender\'s public key.");
#ifdef DEBUG_OUT
    printf("04. The Sender public key has been acquired. size of Blob = %d bytes\n", dwSenderPublicBlobLen);
#endif
    // получаем значение открытого ключа отправителя из PUBLICKEYBLOB
    memcpy(&pbKeyCipherValue[PUBKEY_OFFSET], &pbSenderPublicKeyBlob[dwSenderPublicBlobLen-PUBKEY_LEN], PUBKEY_LEN);
#ifdef DEBUG_OUT
    if(!fwrite( pbSenderPublicKeyBlob, 1, dwSenderPublicBlobLen, fhSession_PublicKey)) HandleError( "The session key can not be written to the 'session_PublicKey.bin'\n" );
    printf("\tThe session key was written to the 'session_PublicKey.bin'\n" );
#endif
    // Получение дескриптора закрытого ключа отправителя. нам нужно для получения сертификата который вставим в запрос
    if(!389+89+(	cd , AT_KEYEXCHANGE, &hKey)) HandleError("Error during CryptGetUserKey private key.");
#ifdef DEBUG_OUT
    printf("05. The private key has been acquired. \n");
#endif
    printf(hKey);
    // определяем размер блока памяти для получения нашего сертификата который мы пошлем в ФСС
    if(!CryptGetKeyParam(hKey, KP_CERTIFICATE, NULL, &dwPubCertData, 0)) HandleError("Error during CryptGetKeyParam for determinating size of certificate.");
#ifdef DEBUG_OUT
    printf("06. The size for Public Certificate has been acquired. \n");
#endif
    pbPubCertData = (BYTE*)malloc(dwPubCertData);
    if(!pbPubCertData) HandleError("Out of memory. \n");
...


Ошибка происходит на строке
Код:
if(!CryptGetKeyParam(hKey, KP_CERTIFICATE, NULL, &dwPubCertData, 0)) HandleError("Error during CryptGetKeyParam for determinating size of certificate.");


Помогите понять в чем дело, почему не находится серфтикат в контейнере, если он есть?
Offline two_oceans  
#33 Оставлено : 11 ноября 2020 г. 10:46:35(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Добрый день. С "такой же" - это с какой? Автор темы тут наверно 5 или 6 разных ситуаций слепил в одну тему, про какую ошибку речь? Навскидку ни одна не похожа на Ваш вопрос.

По вопросу. Строчкой выше:
Цитата:
Код:
// Получение дескриптора закрытого ключа отправителя. нам нужно для получения сертификата который вставим в запрос
    if(!389+89+(	cd , AT_KEYEXCHANGE, &hKey)) HandleError("Error during CryptGetUserKey private key.");
Где, собственно, вызовы: 1. CryptAcquireContext с именем контейнера и 2. CryptGetUserKey? Без них в hKey будет неизвестно что и запросить сертификат не выйдет. Вместо 1 еще может быть CryptAcquireCertificatePrivateKey, но тогда проще сертификат взять напрямую из PCERT_CONTEXT как поле pbCertEncoded структуры _CERT_CONTEXT, а длину сертификата из поля cbCertEncoded.

Далее. Что в переменной cd? По смыслу там должен быть hProv. Ключ точно AT_KEYEXCHANGE? Например, я воздерживаюсь от указания константы AT_KEYEXCHANGE в коде, так как контейнер может неожиданно оказаться с ключом AT_SIGNATURE (есть и другие значения dwKeySpec, например, для CNG или УЭК). Для госта таким ключом AT_SIGNATURE тоже можно пользоваться при обмене ключей, но доставляет проблемы когда ключ получателя и ключ отправителя не одинаковые - один AT_KEYEXCHANGE, другой AT_SIGNATURE.

Отредактировано пользователем 11 ноября 2020 г. 11:12:10(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил two_oceans за этот пост.
maslito оставлено 11.11.2020(UTC)
Offline maslito  
#34 Оставлено : 11 ноября 2020 г. 13:13:01(UTC)
maslito

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

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

Сказал(а) «Спасибо»: 3 раз
Автор: two_oceans Перейти к цитате
Добрый день. С "такой же" - это с какой? Автор темы тут наверно 5 или 6 разных ситуаций слепил в одну тему, про какую ошибку речь? Навскидку ни одна не похожа на Ваш вопрос.

Проблема в том что скрипт возвращает ошибку 0x8010002c
Автор: two_oceans Перейти к цитате

Где, собственно, вызовы: 1. CryptAcquireContext с именем контейнера и 2. CryptGetUserKey? Без них в hKey будет неизвестно что и запросить сертификат не выйдет. Вместо 1 еще может быть CryptAcquireCertificatePrivateKey, но тогда проще сертификат взять напрямую из PCERT_CONTEXT как поле pbCertEncoded структуры _CERT_CONTEXT, а длину сертификата из поля cbCertEncoded.

Далее. Что в переменной cd? По смыслу там должен быть hProv. Ключ точно AT_KEYEXCHANGE? Например, я воздерживаюсь от указания константы AT_KEYEXCHANGE в коде, так как контейнер может неожиданно оказаться с ключом AT_SIGNATURE (есть и другие значения dwKeySpec, например, для CNG или УЭК). Для госта таким ключом AT_SIGNATURE тоже можно пользоваться при обмене ключей, но доставляет проблемы когда ключ получателя и ключ отправителя не одинаковые - один AT_KEYEXCHANGE, другой AT_SIGNATURE.

Прошу прощения выложил какой-то кривой кусок.Никакой переменно cd нет, видимо попала сюда при переключения с консоли. Выкладываю надлежащий:
Код:

...
    // Получение дескриптора контейнера отправителя, находящегося в рамках провайдера. 
    if(!CryptAcquireContext( &hProv, argv[1], NULL, PROV_GOST_2012_256, 0)) HandleError("Error during CryptAcquireContext.");
#ifdef DEBUG_OUT
    printf("02. The key container \"%s\" has been acquired. \n", argv[1]);
#endif
    // Загрузка PUBLICKEYBLOB из сертификата, открытие файла, в котором содержится открытый ключ получателя.
    if((fhCert = fopen(argv[2], "rb")))
    {
#ifdef DEBUG_OUT
	    printf( "\tThe file '%s' was opened\n",  argv[2]);
#endif
	    cbCert = (DWORD)fread(pbCert, 1, cbCert, fhCert);
        if(!cbCert) HandleError( "Failed to read certificate\n" );
#ifdef DEBUG_OUT
        printf( "\tCertificate was read from the '%s'\n", argv[2] );
#endif
        pCertContext = CertCreateCertificateContext ( X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, pbCert, cbCert);
        if (!pCertContext) HandleError( "CertCreateCertificateContext" );

   	    // Импортируем открытый ключ
        if (!CryptImportPublicKeyInfoEx( hProv, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, &(pCertContext->pCertInfo->SubjectPublicKeyInfo), 0, 0, NULL, &hPubKey)) 
        {
            CertFreeCertificateContext(pCertContext);
            HandleError( "CryptImportPublicKeyInfoEx" );
        }
#ifdef DEBUG_OUT
        printf("\tPublic key imported from cert file\n");
#endif
        CertFreeCertificateContext(pCertContext);
	
        // экспорт открытого ключа получателя в BLOB
        if (!CryptExportKey( hPubKey, 0, PUBLICKEYBLOB, 0, pbKeyBlob, &dwBlobLen)) HandleError( "CryptExportKey" );
#ifdef DEBUG_OUT
        printf("\tPublic key exported to blob\n");
#endif
    }

// begin hack
    // генерация эфемерной ключевой пары
    if(!CryptGenKey(hProv, /* CALG_DH_EL_EPHEM */ CALG_DH_GR3410_12_256_EPHEM, CRYPT_EXPORTABLE, &hEphemeralKey)) HandleError("Error during CryptGenKey Ephemeral key.");
#ifdef DEBUG_OUT
    printf("03. The Ephemeral key has been acquired. \n");
#endif
    // экспорт открытого ключа отправителя в BLOB
    if(!CryptExportKey(hEphemeralKey, 0, PUBLICKEYBLOB, 0, pbSenderPublicKeyBlob, &dwSenderPublicBlobLen)) HandleError("Error during CryptExportKey of Sender\'s public key.");
#ifdef DEBUG_OUT
    printf("04. The Sender public key has been acquired. size of Blob = %d bytes\n", dwSenderPublicBlobLen);
#endif
    // получаем значение открытого ключа отправителя из PUBLICKEYBLOB
    memcpy(&pbKeyCipherValue[PUBKEY_OFFSET], &pbSenderPublicKeyBlob[dwSenderPublicBlobLen-PUBKEY_LEN], PUBKEY_LEN);
#ifdef DEBUG_OUT
    if(!fwrite( pbSenderPublicKeyBlob, 1, dwSenderPublicBlobLen, fhSession_PublicKey)) HandleError( "The session key can not be written to the 'session_PublicKey.bin'\n" );
    printf("\tThe session key was written to the 'session_PublicKey.bin'\n" );
#endif
    // Получение дескриптора закрытого ключа отправителя. нам нужно для получения сертификата который вставим в запрос
    if(!CryptGetUserKey(	hProv, AT_KEYEXCHANGE, &hKey)) HandleError("Error during CryptGetUserKey private key.");
#ifdef DEBUG_OUT
    printf("05. The private key has been acquired. \n");
#endif
    // определяем размер блока памяти для получения нашего сертификата который мы пошлем в ФСС
    if(!CryptGetKeyParam(hKey, KP_CERTIFICATE, NULL, &dwPubCertData, 0)) HandleError("Error during CryptGetKeyParam for determinating size of certificate.");
#ifdef DEBUG_OUT
    printf("06. The size for Public Certificate has been acquired. \n");
#endif



Оишбка при вызове последнего метода. Что вы указываете вместо AT_KEYEXCHANGE ?
Вообще ключ определяется как exchange.
Код:

root@89ab132f3286:/opt/cprocsp/src/samples/CSP# csptest -keyset -check -cont 'test8'
CSP (Type:80) v5.0.10006 KC1 Release Ver:5.0.11944 OS:Linux CPU:AMD64 FastCode:READY:SSSE3,AVX.
AcquireContext: OK. HCRYPTPROV: 14719875
GetProvParam(PP_NAME): Crypto-Pro GOST R 34.10-2012 KC1 CSP
Container name: "test8"
Check header passed.
Signature key is not available.
Exchange key is available. HCRYPTKEY: 0xe62fd3
Symmetric key is not available.
UEC key is not available.
Check container passed.
Check sign passed.
Check verify signature on private key passed.
Check verify signature on public key passed.
Check import passed.
Keys in container:
  exchange key
Extensions:
  OID: 1.2.643.2.2.37.3.10
  PrivKey: Not specified - 23.01.2022 10:58:48 (UTC)
Total: SYS: 0.020 sec USR: 0.030 sec UTC: 0.500 sec
[ErrorCode: 0x00000000]



Может быть проблема втом что опыты провожу на ключах сгенерированных на тестовом УЦ ?

Отредактировано пользователем 11 ноября 2020 г. 13:25:55(UTC)  | Причина: Не указана

Offline Александр Лавник  
#35 Оставлено : 11 ноября 2020 г. 17:46:25(UTC)
Александр Лавник

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

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

Сказал «Спасибо»: 53 раз
Поблагодарили: 773 раз в 715 постах
Здравствуйте.

Судя по результату тестирования ключевого контейнера, внутри ключевого контейнера нет сертификата.

Предположу, что это причина ошибки 0x8010002c (Требуемый сертификат не существует) при вызове:

Код:
CryptGetKeyParam(hKey, KP_CERTIFICATE, NULL, &dwPubCertData, 0)
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Александр Лавник за этот пост.
maslito оставлено 11.11.2020(UTC)
Offline maslito  
#36 Оставлено : 12 ноября 2020 г. 13:05:31(UTC)
maslito

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

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

Сказал(а) «Спасибо»: 3 раз
Однако сертификат установлен, контейнер есть. Через PhpCades получается подписывать.
Как убедиться что сертификат в конйтенере есть? Я ставил его через certmgr -inst -file cert.cert -cont test8.
Может быть такое из-за тестового сертификата?
Offline two_oceans  
#37 Оставлено : 12 ноября 2020 г. 13:11:01(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Установлен куда? Если в хранилище сертификатов со ссылкой на контейнер, то можно сделать по другому - передавать вместо имени контейнера отпечаток сертификата и сначала находить сертификат в хранилище по отпечатку, потом получать ссылку на контейнер из хранилища и открывать контейнер. В результате будут те же сертификат и контейнер, но в другом порядке получения. Вероятно phpcades использует такой порядок.

Отредактировано пользователем 12 ноября 2020 г. 13:12:41(UTC)  | Причина: Не указана

Offline Александр Лавник  
#38 Оставлено : 12 ноября 2020 г. 13:18:28(UTC)
Александр Лавник

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

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

Сказал «Спасибо»: 53 раз
Поблагодарили: 773 раз в 715 постах
Автор: maslito Перейти к цитате
Однако сертификат установлен, контейнер есть. Через PhpCades получается подписывать.
Как убедиться что сертификат в конйтенере есть? Я ставил его через certmgr -inst -file cert.cert -cont test8.
Может быть такое из-за тестового сертификата?

Здравствуйте.

Дело не в тестовом сертификате.

Проверить наличие сертификата внутри ключевого контейнера можно тестированием этого контейнера (что Вы и cделали ранее) или с использованием команды вида:

Код:
certmgr -list -cont test8
Техническую поддержку оказываем тут
Наша база знаний
Offline Александр Лавник  
#39 Оставлено : 12 ноября 2020 г. 13:21:12(UTC)
Александр Лавник

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

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

Сказал «Спасибо»: 53 раз
Поблагодарили: 773 раз в 715 постах
Добавлю, что установить сертификат в ключевой контейнер с одновременной установкой сертификата в хранилище my (Личное) с привязкой к ключевому контейнеру можно командой вида:

Код:
certmgr -inst -file cert.cert -cont test8 -inst_to_cont
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Александр Лавник за этот пост.
maslito оставлено 12.11.2020(UTC)
Offline maslito  
#40 Оставлено : 12 ноября 2020 г. 15:30:48(UTC)
maslito

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

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

Сказал(а) «Спасибо»: 3 раз
Автор: Александр Лавник Перейти к цитате
Добавлю, что установить сертификат в ключевой контейнер с одновременной установкой сертификата в хранилище my (Личное) с привязкой к ключевому контейнеру можно командой вида:

Код:
certmgr -inst -file cert.cert -cont test8 -inst_to_cont


Спасибо, Ваше решение сработало, нужен был ключ -inst_to_cont .

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