Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > HTTPS клиент


Автор: east 4.4.2007, 17:43
Подскажите пожалуйста ресурсы по этой теме.Нужно написать https клиент который посылает xml запросы на сервер и получает xml ответы.До этого никогда не программировал для интернета, поэтому нужна информация по-подробней.

Автор: SenkraD 4.4.2007, 18:13
у мя есть код на шарпе. Хоч вывешу.

Автор: east 4.4.2007, 18:27
А на С++. Хотя за не именеем кухарки довольствуются дворником. Давай. Желательно описание библиотек на русском.

Автор: SenkraD 6.4.2007, 17:04
Сори - забыл проверить тему.
Тебе потом надо принятые данные надо вывести в браузер
Или те надо отослать http-запрос и принять, а потом что парсить, это раз.
Во вторых какая платформа Windows/Unix?

P.S. дай ответ сегодня до часиков 9 вечера, тогда мож код с шарпа на С++ переведу и утром в часиков 7 вывешу.

Автор: east 22.4.2007, 20:45
Наконец попал в сеть.
платформа Windows
обычные странички скачиваю, но мне нужно отослать https-запрос и получить ответ, ответ потом обрабатывается по своему.
всё делается в программе никаких броузеров

Автор: SenkraD 23.4.2007, 10:26
Привет.
В принципе вот недавно написал два классика (они не претендуют на роль  лучшей реализации), но строки жмут. Да, ещё одна мелочь, я щас пишу прогу на Builder поэтому там заюзан местами класс String поэтому если ты работаеш под Visual C++ придётся подправить.

Вот пример использования кода (я там щас лишнее не убирал - переменные класса и всё такое).
будет что-то не понятно спрашивай
Код

//                  
    char       szValue[0xFF];
    String     strRequest;
    TXMLParser *pParser;

    m_strCurrentOperation = "1001";
    memset(szValue, '\0', sizeof(szValue));
    pParser = new TXMLParser(SendRequest(strRequest.sprintf(
        "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
        "<request>"
            "<terminalid>%d</terminalid>"
            "<operationid>1001</operationid>"
            "<value>%s</value>"
        "</request>",
        GetTerminalID(),
        m_strChange.c_str())).c_str());

       pParser->GetValue("value", szValue, sizeof(szValue));
       m_strAccountCode = String(szValue);

       PrintCheck("Account.prn");

       delete pParser;

// Вот функция SendRequest - вынес ибо часто повторяется
String __fastcall TfrmMain::SendRequest(String strRequest)
{
    String     strResult;
    TTransport *pTransport;

    pTransport = new TTransport();
    pTransport->Init();
    pTransport->Connect(GetHOSTToConnect(), GetPortToConnect());
    pTransport->SendRequestToServer(strRequest);
    strResult = pTransport->GetData();

    delete pTransport;

    return strResult;
}



Там где #include "Global.h", нуно будет вставить и возможно что-то ещё (нету времени искать)
Код

#include <StdIO.h>
#include <String.h>


Автор: Goganchic 23.4.2007, 10:26
Попробуй использовать библиотеку OpenSSL, она позволяет создать HTTPS соединение и работать с ним как с обычным сокетом, т.е. читать, писать и т.п.

Автор: east 23.4.2007, 20:38
Спасибо. Однако по ходу разница между Builder и Visual существенна. Я использовал WinInet, пака не получается. Обычные странички скачиваю, а с использованием SSL ответа не получаю. Подскажите ресурсы по OpenSSL.

Автор: SenkraD 24.4.2007, 10:33
east,  замени тип String на CString или char* и будет оно под студией работать.
(Он изначально писался под ней).
Я бы вывесил да я их нечаяно удалил, а переделать времени нету

Автор: Goganchic 24.4.2007, 14:06
Цитата(east @  23.4.2007,  20:38 Найти цитируемый пост)
Подскажите ресурсы по OpenSSL. 

http://www.openssl.org

Автор: east 25.4.2007, 10:50
Спасибо. Буду пробовать. Если-что, ещё обращусь.

Автор: Snowy 25.4.2007, 11:56
Цитата(east @  23.4.2007,  20:38 Найти цитируемый пост)
Я использовал WinInet, пака не получается. Обычные странички скачиваю, а с использованием SSL ответа не получаю.
Там разница только в флагах в HTTPOpenRequest.
Для https нужно указать следующие флаги
INTERNET_FLAG_RELOAD INTERNET_FLAG_SECURE INTERNET_FLAG_IGNORE_CERT_CN_INVALID INTERNET_FLAG_IGNORE_CERT_DATE_INVALID
Если после этого HTTPSendRequest вернёт неудачу, проверь GetLastError.
Если там ERROR_INTERNET_INVALID_CA (кривой сертификат), то смотри солюшен в MSDN - там 2 примера кода, как это проигнорировать: можно с диалогом (InternetErrorDlg), а можно тихо (InternetSetOption).
Ну, то что порт и префикс должны быть прописаны правильно - эт думаю само собой понятно.

Добавлено через 6 минут и 52 секунды
Вот общая схема отправки запроса
http://support.microsoft.com/kb/168151
Но отдельно нужно смотреть, если сертификат может быть просроченным, неподписанным и т.п.
Как правило подписанные сертификаты внутри сети не используют. Поэтому приходится немного поплясать с бубном.
Если сертификат нормальный, то пройдёт всё гладко и по стандартной схеме.

Автор: GremlinProg 25.4.2007, 16:16
А кто-нибудь разбирался с SSL на сокет-уровне? Интересует "низкая" реализация протокола, соответственно с использованием SSL-порта 443 и криптованием, с использованием апешки "CryptoAPI", т.е. пишем и читаем непосредственно в сокет, принимаем сертификаты тоже через сокет, без WinInet. Если есть готовые простые схемы (без частной реализации, т.е. ни чего лишнего, только SSL), выложите пожалуйста. В инете много информации, но она более, чем абстрактная, здесь нужны более конкретные структуры хотя бы по MAC- пакету и  HELLO- сообщениям.

Добавлено через 5 минут и 7 секунд
выкладывайте, пожалуйста, только рабочие вещи. По теории, оно гладко и понятно, а на практике - не всегда.

Добавлено через 9 минут и 56 секунд
или не совсем рабочие, но хотя бы с минимальными коментариями по багам

Автор: east 17.5.2007, 20:41
Наконец дошли руки опять до клиента.
Использую WinInet, ставлю флаги для https, получаю ответ с сервера
Код
The page cannot be found
The page you are looking for might have been removed, had its name changed, or is temporarily unavailable. 
--------------------------------------------------------------------------------

Please try the following:

Make sure that the Web site address displayed in the address bar of your browser is spelled and formatted correctly. 
If you reached this page by clicking a link, contact the Web site administrator to alert them that the link is incorrectly formatted. 
Click the Back button to try another link. 
HTTP Error 404 - File or directory not found.
Internet Information Services (IIS)

--------------------------------------------------------------------------------

Technical Information (for support personnel)

Go to Microsoft Product Support Services and perform a title search for the words HTTP and 404. 
Open IIS Help, which is accessible in IIS Manager (inetmgr), and search for topics titled Web Site Setup, Common Administrative Tasks, and About Custom Error Messages. 



Что не так?

Автор: Snowy 18.5.2007, 00:54
404 - на сервере нет запрашиваемого файла.
Кривой урл просишь smile 

Автор: east 20.5.2007, 18:17
Вот код, посмотрите пожалуйста, что не правильно.
Код
    // èíèöèàëèçèðóåì WinInet
    HINTERNET hInternet =
        ::InternetOpen(
            TEXT("netdlg"),
            INTERNET_OPEN_TYPE_PRECONFIG,
            NULL,NULL,
            0);

    if (hInternet != NULL) {
        // îòêðûâàåì HTTP ñåññèþ
        HINTERNET hConnect = 
            ::InternetConnect(
                hInternet,
                TEXT("w3s.webmoney.ru"),
                INTERNET_DEFAULT_HTTPS_PORT,
                "east","TO16G0M4F3",
                INTERNET_SERVICE_HTTP,
                0,
                1u);

        if (hConnect != NULL) {
            // îòêðûâàåì çàïðîñ
            HINTERNET hRequest = 
                ::HttpOpenRequest(
                    hConnect,
                    TEXT("POST"),
                    TEXT("XMLOperations.asp"),
                    HTTP_VERSION,
                    "https://w3s.webmoney.ru/asp/XMLOperations.asp",
                    0,
                    INTERNET_FLAG_SECURE,
                    0);

            if (hRequest != NULL) {
                // ïîñûëàåì çàïðîñ
                BOOL bSend = ::HttpSendRequest(hRequest, NULL,0, str,strlen(str));
                if (bSend) {
                    // ñîçäà¸ì âûõîäíîé ôàéë
                    ofstream fnews("news.html",ios::out|ios::binary);
                    if (fnews.is_open()) for (;;) {
                        // ÷èòàåì äàííûå
                        char  szData[1024];
                        DWORD dwBytesRead;
                        BOOL bRead = 
                            ::InternetReadFile(
                                hRequest,
                                szData,sizeof(szData)-1,
                                &dwBytesRead);

                        // âûõîä èç öèêëà ïðè îøèáêå èëè çàâåðøåíèè
                        if (bRead == FALSE  ||  dwBytesRead == 0)
                            break;

                        // ñîõðàíÿåì ðåçóëüòàò
                        szData[dwBytesRead] = 0;
                        fnews << szData;
                        cout << szData << "\n";
                        cout << str;

                        ok = true;
                    }
                }
                // çàêðûâàåì çàïðîñ
                ::InternetCloseHandle(hRequest);
            }
            // çàêðûâàåì ñåññèþ
            ::InternetCloseHandle(hConnect);
        }
        // çàêðûâàåì WinInet
        ::InternetCloseHandle(hInternet);
    }



Добавлено через 2 минуты и 56 секунд
Вот код, подскажите пожалуйста, что не правильно.
Код
    // èíèöèàëèçèðóåì WinInet
    HINTERNET hInternet =
        ::InternetOpen(
            TEXT("netdlg"),
            INTERNET_OPEN_TYPE_PRECONFIG,
            NULL,NULL,
            0);

    if (hInternet != NULL) {
        // îòêðûâàåì HTTP ñåññèþ
        HINTERNET hConnect = 
            ::InternetConnect(
                hInternet,
                TEXT("w3s.webmoney.ru"),
                INTERNET_DEFAULT_HTTPS_PORT,
                "east","Password",
                INTERNET_SERVICE_HTTP,
                0,
                1u);

        if (hConnect != NULL) {
            // îòêðûâàåì çàïðîñ
            HINTERNET hRequest = 
                ::HttpOpenRequest(
                    hConnect,
                    TEXT("POST"),
                    TEXT("XMLOperations.asp"),
                    HTTP_VERSION,
                    "https://w3s.webmoney.ru/asp/XMLOperations.asp",
                    0,
                    INTERNET_FLAG_SECURE,
                    0);

            if (hRequest != NULL) {
                // ïîñûëàåì çàïðîñ
                BOOL bSend = ::HttpSendRequest(hRequest, NULL,0, str,strlen(str));
                if (bSend) {
                    // ñîçäà¸ì âûõîäíîé ôàéë
                    ofstream fnews("news.html",ios::out|ios::binary);
                    if (fnews.is_open()) for (;;) {
                        // ÷èòàåì äàííûå
                        char  szData[1024];
                        DWORD dwBytesRead;
                        BOOL bRead = 
                            ::InternetReadFile(
                                hRequest,
                                szData,sizeof(szData)-1,
                                &dwBytesRead);

                        // âûõîä èç öèêëà ïðè îøèáêå èëè çàâåðøåíèè
                        if (bRead == FALSE  ||  dwBytesRead == 0)
                            break;

                        // ñîõðàíÿåì ðåçóëüòàò
                        szData[dwBytesRead] = 0;
                        fnews << szData;
                        cout << szData << "\n";
                        cout << str;

                        ok = true;
                    }
                }
                // çàêðûâàåì çàïðîñ
                ::InternetCloseHandle(hRequest);
            }
            // çàêðûâàåì ñåññèþ
            ::InternetCloseHandle(hConnect);
        }
        // çàêðûâàåì WinInet
        ::InternetCloseHandle(hInternet);
    }


Автор: ptr 21.5.2007, 12:53
Ошибка то какая? Что не так работает?

Автор: east 26.5.2007, 17:33
Как перед этим мне объяснили, 404 - нет запрашиваемого файла, не правильно делаю запрос.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)