Создание контекста безопасности Schannel
Чтобы создать контекст безопасности , который будет защищать обмен данными между клиентом и сервером, оба должны участвовать в следующем процессе обмена информацией:
клиент
- Клиент вызывает функцию InitializeSecurityContext (General).
- Schannel начинает создавать контекст безопасности в соответствии с правилами выбранного протокола безопасности. Код возврата функции указывает, должен ли клиент снова вызывать функцию. InitializeSecurityContext (General) может возвращать маркер, представляющий контекст.
- Если маркер был возвращен, клиент отправляет его на сервер.
- Когда Функция InitializeSecurityContext (General) возвращает SEC_E_OK, клиент завершает работу. Если функция возвращает SEC_I_CONTINUE_NEEDED, клиент должен дождаться, пока сервер отправит ему маркер. Когда клиент получает маркер с сервера, он должен снова вызвать функциюInitializeSecurityContext (General). (Вернитесь к шагу 2.)
Сервер
- Сервер ожидает отправки клиентом сообщения, содержащего маркер безопасности. Сервер передает маркер, полученный от клиента, в функцию AcceptSecurityContext (General).
- Schannel основывается на частичном контексте безопасности, представленном маркером. Schannel возвращает на сервер маркер и код возврата, указывающий, должен ли сервер снова вызвать функцию.
- Если маркер был возвращен, сервер отправляет его клиенту.
- Когда AcceptSecurityContext (General) возвращает SEC_E_OK, сервер завершает работу. Если функция возвращает SEC_I_CONTINUE_NEEDED, сервер должен дождаться, пока клиент отправит ему маркер. Когда сервер получает маркер от клиента, он должен снова вызвать функцию AcceptSecurityContext (General). (Вернитесь к шагу 2.)
Если функция возвращает значение, отличное от SEC_E_OK, SEC_I_CONTINUE_NEEDED или SEC_E_INCOMPLETE_MESSAGE (см. следующий абзац), произошла ошибка. Клиент и сервер должны вызвать функцию DeleteSecurityContext , чтобы удалить частично установленный контекст безопасности.
Особый случай, который может изменить обработку клиента и сервера, заключается в том, что клиенту или серверу отправляется слишком мало или слишком много информации от другой стороны. В случае слишком малой информации обе функции возвращают SEC_E_INCOMPLETE_MESSAGE. Сведения о распознавании и обработке недостаточной или избыточной информации см. в разделе Дополнительные буферы, возвращаемые Schannel.
Связанные темы