09.01.2007 18:05:13Проблема с тестовым центром CryptoPro TSP Ответов: 10
Вадим
Здравствуйте. Каким образом можно передать сформированный запрос на получение метки времени? Обычный POST HttpSendRequest и последующий GET возращает файл tsp.srf. InternetWriteFile запрашивает пароль, по всей видимости. Что надо применить для решения данной задачи?
 
Ответы:
09.01.2007 19:00:12Седов Роман
Добрый день.
Во-первых, рекомендую использовать WinHTTP-API вместо устаревшего WinINET.
Далее, HTTP-запрос должен быть один - "POST", и необходимо "читать" информацию, возвращенную сервером в ответ на него.
А вообще, вы можете воспользоваться КриптоПро TSP SDK, где уже реализовано обращение к службе штампов.
09.01.2007 19:02:13Седов Роман
http://www.cryptopro.ru/CryptoPro/products/tsp/sdk.htm
10.01.2007 11:40:06Вадим
Спасибо за ответ. Но в любом случае получается не то, что ожидается - все тот же файл 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.
10.01.2007 12:10:09Седов Роман
А что вы имеете в виду под "все тот же файл tsp.srf"?
Те данные, которые возвращает сервер, - это и есть ответ службы штампов. И он содержит штамп времени, если операция прошла успешно.
10.01.2007 12:13:49Вадим
Ответ от TSP не может быть равен 13 байтам, особенно если в запросе присутствует запрос на включение сертификата службы штампа времени. Под файлом tsp.srf я понимаю файл, лежащий по адресу www.cryptopro.ru/tsp/tsp.srf. При отправленном запросе сервер все равно возращает этот файл.
10.01.2007 12:18:44Седов Роман
Если вы думаете, что развер ответа не может быть 13 байт, то я бы посоветовал вам почитать RFC3161, описывающий структуру ответа службы штампов.
И еще раз хотел бы порекомендовать использовать КриптоПро TSP SDK, который предоставляет простой интерфейс работы со штампами времени, без необходимости разбираться с сетевым взаимодействием и форматами объектов.
10.01.2007 12:34:57Вадим
Объясню, почему я сказал, что 13 байт не может быть в данном случае. Запрос на штамп соответствует rfc3161, в него включен запрос на получение сертификата службы. Добавлен hash сообщения.

В данном случае мне непонятно, где ошибка в коде - отправке или получении. Как я понимаю, это ответ ошибки, значит проблема в отправке. Но проблемы я не вижу, к сожалению, поэтому прошу помощи.
10.01.2007 12:46:10Седов Роман
Пришлите мне на sedov@cryptopro.ru ваш запрос и я скажу, что в нем не так.
10.01.2007 13:29:59Седов Роман
У вас в запросе длина хеша по якобы sha1 - 16 байт. А должно быть 20.
10.01.2007 14:22:22
Точно, там был MD5 хэш. Как-то не сопоставил эти моменты. Спасибо, Роман.