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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline solvitz  
#1 Оставлено : 17 июня 2016 г. 3:24:06(UTC)
solvitz

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

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

Создаю self-signed сертификат с расширенной возможность подписывать другие сертификаты (ЦС), с помощью такого кода:

Код:
        basicConstraints.fCA = TRUE;
        basicConstraints.fPathLenConstraint = TRUE;
        basicConstraints.dwPathLenConstraint = 0;
        
        if (!CryptEncodeObject(X509_ASN_ENCODING, szOID_BASIC_CONSTRAINTS2, &basicConstraints, NULL, &dwSize))
        {
            return FALSE;
        }
        
        lpData = HeapAlloc(GetProcessHeap(), 0, dwSize);
        if (!lpData)
        {
            return FALSE;
        }
        
        if (!CryptEncodeObject(X509_ASN_ENCODING, szOID_BASIC_CONSTRAINTS2, &basicConstraints, lpData, &dwSize))
        {
            HeapFree(GetProcessHeap(), 0, lpData);
            return FALSE;
        }
        
        ext.pszObjId = szOID_BASIC_CONSTRAINTS2;
        ext.fCritical = TRUE;
        ext.Value.cbData = dwSize;
        ext.Value.pbData = lpData;
        exts.cExtension = 1;
        exts.rgExtension = &ext;
        
        ZeroMemory(&kpi, sizeof(kpi));
        kpi.pwszContainerName = container;
        kpi.pwszProvName = NULL;
        kpi.dwProvType = PROV_RSA_FULL;
        kpi.dwFlags = CRYPT_MACHINE_KEYSET;
        kpi.cProvParam = 0;
        kpi.rgProvParam = NULL;
        kpi.dwKeySpec = AT_KEYEXCHANGE;
        
        ZeroMemory(&sa, sizeof(sa));
        sa.pszObjId = szOID_RSA_SHA256RSA;
        
        GetSystemTime(&et);
        et.wYear += 10;
        
        createdContext = CertCreateSelfSignCertificate(hProv, &sib, 0, &kpi, &sa, NULL, &et, &exts);


Теперь надо создать второй self-signed сертификат и подписать его первым, так чтобы первый сертификат был удостоверяющим для второго.
Как это сделать? Хотя бы порядок вызова АПИшек напишите для подписи второго сертификата. Зараннее спасибо!
Offline Kirill Sobolev  
#2 Оставлено : 17 июня 2016 г. 11:04:56(UTC)
Кирилл Соболев

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

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
CryptSignAndEncodeCertificate
Там же есть ссылка на пример создания запроса.
Для создания сертификата вызовы в принципе те же, только заполняется другая структура (CERT_INFO) и подписывается на ключе сертификата ЦС.
Техническую поддержку оказываем тут
Наша база знаний
Offline solvitz  
#3 Оставлено : 22 июля 2016 г. 2:09:39(UTC)
solvitz

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

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

Дабы не плодить слишком много тем, спрошу в своей прошлой.

При вызове AcquireCredentialsHandle происходит странная вещь - программа долго выполняет эту API, около 20 секунд. В структуру SCHANNEL_CRED я заношу указатель на контекст того сертификата, который я создал и подписал другим сертификатом. При этом API возвращает как и положено SEC_E_OK, но если вызвать GetLastError() после нее, то он возвращает код ошибки 0x80092004 (CRYPT_E_NOT_FOUND). А вот если вместо этого сертификата подсунуть другой самоподписанный, то АПИшка выполнится мгновенно, вернет тоже SEC_E_OK, а вот GetLastError() не вернет никакой ошибки. Подскажите как убрать эту задержку, для веб-приложения она критична.

И еще такой вопрос, почему у меня при приеме запроса HTTPS дешифруется всего лишь один байт, хотя я вижу что пришло около 500, handshake с клиентом при этом отрабатывается нормально и в буфер данные поступают, а вот после декодирования остается один расшифрованный байт?
Код:
    ZeroMemory(&schannelCred, sizeof(schannelCred));

    schannelCred.dwVersion = SCHANNEL_CRED_VERSION;
    schannelCred.cCreds = 1;
    schannelCred.grbitEnabledProtocols = SP_PROT_SSL3TLS1;
    schannelCred.paCred = &server_cert;

    status = AcquireCredentialsHandle(NULL, UNISP_NAME, SECPKG_CRED_INBOUND, NULL, &schannelCred, NULL, NULL, &creds, &tExp);
    if (status != SEC_E_OK)
    {
        return FALSE;
    }
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.