Аутентификация клиента (сертификат + закрытый ключ) с использованием WinHttp - PullRequest
1 голос
/ 20 марта 2019

Я пытаюсь общаться в https с сервером, используя Win32 API.

Вот очень минималистский код:

HINTERNET ses = WinHttpOpen(L"test",WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,WINHTTP_NO_PROXY_NAME,WINHTTP_NO_PROXY_BYPASS,0 ) ;
HINTERNET con = WinHttpConnect(ses,L"stackoverflow.com",INTERNET_DEFAULT_HTTPS_PORT,0 ) ;
HINTERNET req = WinHttpOpenRequest(con,L"GET",NULL,NULL,WINHTTP_NO_REFERER,WINHTTP_DEFAULT_ACCEPT_TYPES,WINHTTP_FLAG_SECURE ) ;
WinHttpSendRequest( req,WINHTTP_NO_ADDITIONAL_HEADERS,0,WINHTTP_NO_REQUEST_DATA,0,0,0 ) ;
WinHttpReceiveResponse( req,NULL ) ;
char buffer [10000] ;
unsigned long size ;
WinHttpReadData( req,reinterpret_cast<void*>( buffer ),sizeof( buffer )-1,&size ) ;
buffer[size] = 0 ;
cout << buffer << endl ;

Пока я общаюсь с "классическим""https сервер как stackoverflow.com все идет хорошо.Проблема заключается в том, что я пытаюсь установить связь с сервером, который запрашивает аутентификацию клиента.

У меня есть 3 файла .pem: сертификат и закрытый ключ для моего клиента, а также корневой сертификат, который аутентифицирует моего клиента.сертификат (т. е. цепочка сертификатов длиной 2).

Для информации я могу подключить свой сервер с помощью командной строки cULR:

curl https://my.server --cert Client_cert.pem --key Client_key.pem --cacert Root_cert.pem Так что я знаю, что это возможно!

Читая документацию по win32 API, я понял, что ключ должен вызывать WinHttpSetOption, но между вариантами WINHTTP_OPTION_CLIENT_CERT_CONTEXT и WINHTTP_OPTION_CLIENT_CERT_ISSUER_LIST неясно ... И я не узнал, какпередать мои данные (сертификат + файлы ключей).

Есть мудрый совет?Заранее спасибо!

...