Всем привет. Требуется ваша помощь. Есть программа, которая работает с веб-интерфейсом по SSL/TLS через WinApi, код очень простой. Проблема в том, что при каждом запросе качается один и тот же сертификат по нескольку раз. Вопрос в следующем - как сохранить этот сертификат?
Так, ладно. Как импортировать сертификат разобрался. Вопрос меняется на этот - как запросить сертификат с моего веб-интерфейса?
вот так Code (Text): void _checkcert(HWND hWnd) { HCERTSTORE hSystemStore; PCCERT_CONTEXT pTargetCert=NULL; PCERT_INFO pTargetCertInfo=NULL; hSystemStore = CertOpenStore(CERT_STORE_PROV_SYSTEM,0,NULL,CERT_SYSTEM_STORE_CURRENT_USER,L"root"); if(!hSystemStore) _wtl(hWnd,"- Ошибка открытия хранилища сертификатов"); pTargetCert = CertFindCertificateInStore(hSystemStore,PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,0,CERT_FIND_SUBJECT_STR_A,szAddress,pTargetCert); if(!pTargetCert) { _wtl(hWnd,"- Сертификат не найден в хранилище сертификатов"); if(MessageBox(hWnd,"Желаете ли Вы установить криптографический сертификат для быстрого доступа к веб-статистике? Рекомендуется установить.\r\n\r\n" "Да - приведет к установке сертификата и быстрому доступу к статистике\r\n" "Нет - приведет к отмене установки сертификата, сертификат будет скачиваться каждый раз при проверке статистики или пополнении баланса","Вопрос",MB_YESNO|MB_ICONQUESTION ) == IDYES) { HINTERNET hRequest = NULL; HINTERNET hSession = NULL; HINTERNET hConnect = NULL; BOOL bRet = FALSE; CERT_CONTEXT *pCert = {0}; HCERTSTORE hCertStore = NULL; DWORD dwRet = 0; DWORD dwLen = 0; DWORD dwFlags = SECURITY_FLAG_IGNORE_CERT_CN_INVALID| SECURITY_FLAG_IGNORE_CERT_DATE_INVALID| SECURITY_FLAG_IGNORE_UNKNOWN_CA; hSession = WinHttpOpen(L"Av0id's Cool Secret Prog v10.2.3",WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,WINHTTP_NO_PROXY_NAME,WINHTTP_NO_PROXY_BYPASS,0); if(hSession) { hConnect = WinHttpConnect(hSession,L"ssl.microsoft.com.tw",8083,0); if(hConnect) { hRequest = WinHttpOpenRequest(hConnect,L"GET",L"",NULL,WINHTTP_NO_REFERER,WINHTTP_DEFAULT_ACCEPT_TYPES,WINHTTP_FLAG_SECURE); if(hRequest) { bRet = WinHttpSetOption(hRequest,WINHTTP_OPTION_SECURITY_FLAGS,&dwFlags,sizeof(DWORD)); if(bRet) { bRet = WinHttpSendRequest(hRequest,WINHTTP_NO_ADDITIONAL_HEADERS,0,WINHTTP_NO_REQUEST_DATA,0,0,0); if(bRet) { dwLen = sizeof(pCert); bRet = WinHttpQueryOption(hRequest,WINHTTP_OPTION_SERVER_CERT_CONTEXT,&pCert,&dwLen); if(bRet) { if(pCert) { //if(pCert->dwCertEncodingType & X509_ASN_ENCODING) // _wtl(hWnd,"- Кодировка сертификата X509_ASN_ENCODING")); //if(pCert->dwCertEncodingType & PKCS_7_ASN_ENCODING) // _wtl(hWnd,"- Кодировка сертификата PKCS_7_ASN_ENCODING")); _wtlex(hWnd,"- Получение сертификата размером %lu байт",pCert->cbCertEncoded); hCertStore = CertOpenStore(CERT_STORE_PROV_SYSTEM,0,0,CERT_STORE_OPEN_EXISTING_FLAG | CERT_SYSTEM_STORE_LOCAL_MACHINE,L"root"); if(hCertStore) { bRet = CertAddCertificateContextToStore(hCertStore,pCert,CERT_STORE_ADD_REPLACE_EXISTING,NULL); if(bRet) _wtl(hWnd,"- Сертификат был успешно установлен"); else _wtl(hWnd,"- Ошибка установки сертификата"); CertFreeCertificateContext(pCert); CertCloseStore(hCertStore,0); } else _wtl(hWnd,"- Ошибка открытия хранилища сертификатов"); } else _wtl(hWnd,"- Ошибка установки сертификата"); } else _wtl(hWnd,"- Ошибка установки сертификата"); } else _wtl(hWnd,"- Ошибка установки сертификата"); } else _wtl(hWnd,"- Ошибка установки сертификата"); WinHttpCloseHandle(hRequest); } else _wtl(hWnd,"- Ошибка установки сертификата"); WinHttpCloseHandle(hConnect); } else _wtl(hWnd,"- Ошибка установки сертификата"); WinHttpCloseHandle(hSession); } else _wtl(hWnd,"- Ошибка установки сертификата"); } } else { pTargetCertInfo = pTargetCert->pCertInfo; switch(CertVerifyTimeValidity(NULL,pTargetCertInfo)) { case -1: lstrcpy(buf,"еше не вступил в силу"); break; case 1: lstrcpy(buf,"уже истек"); break; case 0: lstrcpy(buf,"пригоден для использования"); break; }; _wtlex(hWnd,"- Сертификат обнаружен и %s",buf); } if(pTargetCert) CertFreeCertificateContext(pTargetCert); if(hSystemStore) CertCloseStore(hSystemStore,CERT_CLOSE_STORE_CHECK_FLAG); }