Статус: Новичок
Группы: Участники
Зарегистрирован: 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 сертификат и подписать его первым, так чтобы первый сертификат был удостоверяющим для второго. Как это сделать? Хотя бы порядок вызова АПИшек напишите для подписи второго сертификата. Зараннее спасибо!
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
CryptSignAndEncodeCertificateТам же есть ссылка на пример создания запроса. Для создания сертификата вызовы в принципе те же, только заполняется другая структура (CERT_INFO) и подписывается на ключе сертификата ЦС. |
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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;
}
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close