| ||||
| ||||
Здравствуйте. Каким образом можно передать сформированный запрос на получение метки времени? Обычный POST HttpSendRequest и последующий GET возращает файл tsp.srf. InternetWriteFile запрашивает пароль, по всей видимости. Что надо применить для решения данной задачи? | ||||
Ответы: | ||||
| ||||
Добрый день. Во-первых, рекомендую использовать WinHTTP-API вместо устаревшего WinINET. Далее, HTTP-запрос должен быть один - "POST", и необходимо "читать" информацию, возвращенную сервером в ответ на него. А вообще, вы можете воспользоваться КриптоПро TSP SDK, где уже реализовано обращение к службе штампов. | ||||
| ||||
http://www.cryptopro.ru/CryptoPro/products/tsp/sdk.htm | ||||
| ||||
Спасибо за ответ. Но в любом случае получается не то, что ожидается - все тот же файл tsp.srf. Вот упрощенный используемый код для запроса: HINTERNET hHttpSession = NULL; HINTERNET hConnect = NULL; HINTERNET hRequest = NULL; if(! (hHttpSession = WinHttpOpen( L"TestTSP", WINHTTP_ACCESS_TYPE_NO_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0 )) ) { //MakeClean(); return false; } if ( !(hConnect = WinHttpConnect( hHttpSession, L"www.cryptopro.ru", INTERNET_DEFAULT_HTTP_PORT, 0 ))) { //MakeClean(); return false; } if ( !(hRequest = WinHttpOpenRequest( hConnect, L"POST", L"/tsp/tsp.srf", L"HTTP/1.1", WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0 ))) { //MakeClean(); return false; } if( !WinHttpSendRequest( hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, tspRequest,//unsigned char *tspRequest requestSize, requestSize, NULL ) ) { //MakeClean(); return false; } if( !WinHttpReceiveResponse( hRequest, NULL ) ) { //MakeClean(); return false; } DWORD dwSize; do { dwSize = 0; if (!WinHttpQueryDataAvailable( hRequest, &dwSize))//тут всегда 13 байт printf("Error %u in WinHttpQueryDataAvailable.\n",GetLastError()); } while (dwSize>0); tspRequest - сам запрос, полностью соответствует RFC. | ||||
| ||||
А что вы имеете в виду под "все тот же файл tsp.srf"? Те данные, которые возвращает сервер, - это и есть ответ службы штампов. И он содержит штамп времени, если операция прошла успешно. | ||||
| ||||
Ответ от TSP не может быть равен 13 байтам, особенно если в запросе присутствует запрос на включение сертификата службы штампа времени. Под файлом tsp.srf я понимаю файл, лежащий по адресу www.cryptopro.ru/tsp/tsp.srf. При отправленном запросе сервер все равно возращает этот файл. | ||||
| ||||
Если вы думаете, что развер ответа не может быть 13 байт, то я бы посоветовал вам почитать RFC3161, описывающий структуру ответа службы штампов. И еще раз хотел бы порекомендовать использовать КриптоПро TSP SDK, который предоставляет простой интерфейс работы со штампами времени, без необходимости разбираться с сетевым взаимодействием и форматами объектов. | ||||
| ||||
Объясню, почему я сказал, что 13 байт не может быть в данном случае. Запрос на штамп соответствует rfc3161, в него включен запрос на получение сертификата службы. Добавлен hash сообщения. В данном случае мне непонятно, где ошибка в коде - отправке или получении. Как я понимаю, это ответ ошибки, значит проблема в отправке. Но проблемы я не вижу, к сожалению, поэтому прошу помощи. | ||||
| ||||
Пришлите мне на sedov@cryptopro.ru ваш запрос и я скажу, что в нем не так. | ||||
| ||||
У вас в запросе длина хеша по якобы sha1 - 16 байт. А должно быть 20. | ||||
| ||||
Точно, там был MD5 хэш. Как-то не сопоставил эти моменты. Спасибо, Роман. | ||||