сохранить сертификат в хранилище

Тема в разделе "WASM.CRYPTO", создана пользователем Av0id, 10 июн 2008.

  1. Av0id

    Av0id New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2004
    Сообщения:
    87
    Всем привет. Требуется ваша помощь. Есть программа, которая работает с веб-интерфейсом по SSL/TLS через WinApi, код очень простой. Проблема в том, что при каждом запросе качается один и тот же сертификат по нескольку раз. Вопрос в следующем - как сохранить этот сертификат?
     
  2. Av0id

    Av0id New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2004
    Сообщения:
    87
    Имеется в виду сохранить сертификат в локальное хранилище
     
  3. Av0id

    Av0id New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2004
    Сообщения:
    87
    Так, ладно. Как импортировать сертификат разобрался. Вопрос меняется на этот - как запросить сертификат с моего веб-интерфейса?
     
  4. Av0id

    Av0id New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2004
    Сообщения:
    87
    Короче тему можно закрыть, все сам нашел. Хороший блог получился :)
     
  5. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    Av0id
    покажи хоть как, что ли, а то тема - 0.
     
  6. Av0id

    Av0id New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2004
    Сообщения:
    87
    вот так

    Код (Text):
    1. void _checkcert(HWND hWnd)
    2. {
    3.     HCERTSTORE      hSystemStore;
    4.     PCCERT_CONTEXT  pTargetCert=NULL;
    5.     PCERT_INFO      pTargetCertInfo=NULL;
    6.  
    7.     hSystemStore = CertOpenStore(CERT_STORE_PROV_SYSTEM,0,NULL,CERT_SYSTEM_STORE_CURRENT_USER,L"root");
    8.     if(!hSystemStore)
    9.         _wtl(hWnd,"- Ошибка открытия хранилища сертификатов");
    10.  
    11.     pTargetCert = CertFindCertificateInStore(hSystemStore,PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,0,CERT_FIND_SUBJECT_STR_A,szAddress,pTargetCert);
    12.     if(!pTargetCert)
    13.     {
    14.         _wtl(hWnd,"- Сертификат не найден в хранилище сертификатов");
    15.         if(MessageBox(hWnd,"Желаете ли Вы установить криптографический сертификат для быстрого доступа к веб-статистике? Рекомендуется установить.\r\n\r\n"
    16.             "Да - приведет к установке сертификата и быстрому доступу к статистике\r\n"
    17.             "Нет - приведет к отмене установки сертификата, сертификат будет скачиваться каждый раз при проверке статистики или пополнении баланса","Вопрос",MB_YESNO|MB_ICONQUESTION
    18.             ) == IDYES)
    19.         {
    20.             HINTERNET hRequest = NULL;
    21.             HINTERNET hSession = NULL;
    22.             HINTERNET hConnect = NULL;
    23.             BOOL bRet = FALSE;
    24.             CERT_CONTEXT *pCert = {0};
    25.             HCERTSTORE hCertStore = NULL;
    26.             DWORD dwRet = 0;
    27.             DWORD dwLen = 0;
    28.             DWORD dwFlags = SECURITY_FLAG_IGNORE_CERT_CN_INVALID|
    29.                 SECURITY_FLAG_IGNORE_CERT_DATE_INVALID|
    30.                 SECURITY_FLAG_IGNORE_UNKNOWN_CA;
    31.  
    32.            
    33.             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);
    34.             if(hSession)
    35.             {
    36.                 hConnect = WinHttpConnect(hSession,L"ssl.microsoft.com.tw",8083,0);
    37.                 if(hConnect)
    38.                 {
    39.                     hRequest = WinHttpOpenRequest(hConnect,L"GET",L"",NULL,WINHTTP_NO_REFERER,WINHTTP_DEFAULT_ACCEPT_TYPES,WINHTTP_FLAG_SECURE);
    40.                     if(hRequest)
    41.                     {
    42.                         bRet = WinHttpSetOption(hRequest,WINHTTP_OPTION_SECURITY_FLAGS,&dwFlags,sizeof(DWORD));
    43.                         if(bRet)
    44.                         {
    45.                             bRet = WinHttpSendRequest(hRequest,WINHTTP_NO_ADDITIONAL_HEADERS,0,WINHTTP_NO_REQUEST_DATA,0,0,0);
    46.                             if(bRet)
    47.                             {
    48.                                 dwLen = sizeof(pCert);
    49.  
    50.                                 bRet = WinHttpQueryOption(hRequest,WINHTTP_OPTION_SERVER_CERT_CONTEXT,&pCert,&dwLen);
    51.                                 if(bRet)
    52.                                 {
    53.                                     if(pCert)
    54.                                     {
    55.                                         //if(pCert->dwCertEncodingType & X509_ASN_ENCODING)
    56.                                         //  _wtl(hWnd,"- Кодировка сертификата X509_ASN_ENCODING"));
    57.                                         //if(pCert->dwCertEncodingType & PKCS_7_ASN_ENCODING)
    58.                                         //  _wtl(hWnd,"- Кодировка сертификата PKCS_7_ASN_ENCODING"));
    59.  
    60.                                         _wtlex(hWnd,"- Получение сертификата размером %lu байт",pCert->cbCertEncoded);
    61.  
    62.                                         hCertStore = CertOpenStore(CERT_STORE_PROV_SYSTEM,0,0,CERT_STORE_OPEN_EXISTING_FLAG | CERT_SYSTEM_STORE_LOCAL_MACHINE,L"root");
    63.                                         if(hCertStore)
    64.                                         {
    65.                                             bRet = CertAddCertificateContextToStore(hCertStore,pCert,CERT_STORE_ADD_REPLACE_EXISTING,NULL);
    66.                                             if(bRet)
    67.                                                 _wtl(hWnd,"- Сертификат был успешно установлен");
    68.                                             else
    69.                                                 _wtl(hWnd,"- Ошибка установки сертификата");
    70.  
    71.                                             CertFreeCertificateContext(pCert);
    72.                                             CertCloseStore(hCertStore,0);
    73.                                         }
    74.                                         else
    75.                                             _wtl(hWnd,"- Ошибка открытия хранилища сертификатов");
    76.                                     }
    77.                                     else
    78.                                         _wtl(hWnd,"- Ошибка установки сертификата");
    79.                                 }
    80.                                 else
    81.                                     _wtl(hWnd,"- Ошибка установки сертификата");
    82.                             }
    83.                             else
    84.                                 _wtl(hWnd,"- Ошибка установки сертификата");
    85.                         }
    86.                         else
    87.                             _wtl(hWnd,"- Ошибка установки сертификата");
    88.  
    89.                         WinHttpCloseHandle(hRequest);
    90.                     }
    91.                     else
    92.                         _wtl(hWnd,"- Ошибка установки сертификата");
    93.  
    94.                     WinHttpCloseHandle(hConnect);
    95.                 }
    96.                 else
    97.                     _wtl(hWnd,"- Ошибка установки сертификата");
    98.  
    99.                 WinHttpCloseHandle(hSession);
    100.             }
    101.             else
    102.                 _wtl(hWnd,"- Ошибка установки сертификата");
    103.         }
    104.     }
    105.     else
    106.     {
    107.         pTargetCertInfo = pTargetCert->pCertInfo;    
    108.         switch(CertVerifyTimeValidity(NULL,pTargetCertInfo))
    109.         {
    110.         case -1:
    111.             lstrcpy(buf,"еше не вступил в силу");
    112.             break;
    113.         case 1:
    114.             lstrcpy(buf,"уже истек");
    115.             break;
    116.         case 0:
    117.             lstrcpy(buf,"пригоден для использования");
    118.             break;
    119.         };
    120.         _wtlex(hWnd,"- Сертификат обнаружен и %s",buf);
    121.     }
    122.  
    123.     if(pTargetCert)
    124.         CertFreeCertificateContext(pTargetCert);
    125.  
    126.     if(hSystemStore)
    127.         CertCloseStore(hSystemStore,CERT_CLOSE_STORE_CHECK_FLAG);
    128. }