Я пытаюсь общаться в 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
неясно ... И я не узнал, какпередать мои данные (сертификат + файлы ключей).
Есть мудрый совет?Заранее спасибо!