У меня есть простое приложение клиентского сокета, с помощью которого я хочу получить доступ к веб-сайту. Чтобы получить доступ к Интернету, мой клиент должен пройти через прокси-сервер HTTP (я использую Microsoft Forefront Threat Management Gateway). Прокси-сервер требует аутентификации и настроен на прием Kerberos через GSSAPI.
В моем клиенте я использую Microsoft SSPI:
Сначала я вызываю AcquireCredentialsHandle, который завершается успешно и возвращает SEC_E_OK
Затем я вызываю InitializeSecurityContext, который также завершается успешно и возвращает SEC_E_OK
Все идет нормально. Но теперь мне нужно отправить токен на прокси-сервер для авторизации, и это та часть, которая вызывает у меня проблемы.
Если я подключаюсь к своему прокси-серверу с помощью Internet Explorer, я могу наблюдать за обменом пакетами через Wireshark. IE согласовывает билет с Kerberos и, похоже, отправляет его через заголовок Proxy-Authorization. Кажется, что содержимое заголовка закодировано в base64.
Если я просто возьму токен, который возвращается из InitializeSecurityContext
, base64 закодирует его и отправлю результат на прокси-сервер через заголовок типа Proxy-Authorization: Negotiate <base64Data>
, аутентификация не удастся.
Я чувствую, что близок, но все еще чего-то не хватает. На одном сайте обсуждалось использование EncryptMessage для токена перед его отправкой. Другой обсуждает использование взаимной аутентификации (я не думаю, что IE использует взаимную аутентификацию, потому что кажется, что клиент отправляет авторизацию только один раз, и нет данных обратной связи с сервера (с помощью которых можно вызвать InitializeSecurityContext
во второй раз). Другой сайт обрисовал в общих чертах размещение токена с различными SEC_BUFFER
типами (заполнение, данные и т. д.) и шифрованием. Я подозреваю, что это именно то, что мне нужно сделать, поскольку я не нахожу много документации о том, как это сделать.
Будем признательны за любые идеи или предложения.
ОБНОВЛЕНИЕ 19.07.2014: Для ясности, я спрашиваю, как использовать SSPI для вычисления поля «base64Data» (как указано выше). При вычислении base64, кодирующего содержимое, содержащееся в буфере SECBUFFER_TOKEN, было моим первоначальным предположением, сервер не принимает результат, поэтому он явно недействителен.
Дальнейшие исследования показывают, что токен должен быть «обернут» (он же «EncryptMessage» через SSPI) и для шифрования способом, совместимым с GSSAPI, необходимо использовать три буфера (в порядке: SECBUFFER_TOKEN, SECBUFFER_DATA и SECBUFFER_PADDING). это вчера, но успеха не имел.