Взаимодействие SSPI/Kerberos с GSSAPI
При использовании поставщика поддержки безопасностиKerberos (SSP) необходимо соблюдать осторожность, если требуется взаимодействие с GSSAPI. Следующие соглашения о коде позволяют взаимодействовать с приложениями на основе GSSAPI:
Пример кода можно найти в пакете SDK для платформы в разделе Samples\Security\SSPI\GSS. Кроме того, эквивалентный пример UNIX распространяется в дистрибутивах Mit и Heimdal Kerberos, клиенте И сервере GSS.
Имена Windows-Compatible
Функции GSSAPI используют формат имени, известный как gss_nt_service_name, как указано в RFC. Например, — это имя, sample@host.dom.com которое можно использовать в приложении на основе GSSAPI. Операционная система Windows не распознает формат gss_nt_service_name, и необходимо использовать полное имя субъекта-службы, например sample/host.dom.com@REALM.
Аутентификация
Проверка подлинности обычно выполняется при первой настройке соединения между клиентом и сервером. В этом примере клиент использует интерфейс поставщика поддержки безопасности (SSPI), а сервер использует GSSAPI.
Настройка проверки подлинности в клиенте SSPI
- Получение исходящих учетных данных с помощью AcquireCredentialsHandle.
- Создайте имя службы с gss_import_name() и получите входящие учетные данные с помощью gss_acquire_cred.
- Получите маркер проверки подлинности для отправки на сервер с помощью InitializeSecurityContext (Kerberos).
- Отправьте маркер на сервер.
Настройка проверки подлинности на сервере GSSAPI
Выполните синтаксический анализ сообщения от клиента, чтобы извлечь маркер безопасности. Используйте функцию gss_accept_sec_context , передав маркер в качестве аргумента.
Выполните синтаксический анализ сообщения с сервера, чтобы извлечь маркер безопасности. Передайте этот маркер безопасности в файл InitializeSecurityContext (Kerberos).
Отправка маркера ответа клиенту.
Функция gss_accept_sec_context может возвращать маркер, который можно отправить клиенту.
Если необходимо продолжить, отправьте маркер ответа на сервер; В противном случае настройка проверки подлинности завершена.
Если необходимо продолжить, дождитесь следующего маркера от клиента; В противном случае настройка проверки подлинности завершена.
Целостность и конфиденциальность сообщений
Большинство приложений на основе GSSAPI используют функцию GSS_Wrap для подписывания сообщения перед его отправкой. И наоборот, функция GSS_Unwrap проверяет сигнатуру. GSS_Wrap доступна в версии 2.0 API и в настоящее время широко используется и указывается в стандартах Интернета, описывающих использование GSSAPI для обеспечения безопасности протоколов. Ранее функции GSS SignMessage и SealMessage использовались для обеспечения целостности и конфиденциальности сообщений. GSS_Wrap и GSS_Unwrap используются для обеспечения целостности и конфиденциальности с использованием конфиденциальности, контролируемой значением аргумента "conf_flag".
Если для использования функций gss_get_mic и gss_verify_mic указан протокол на основе GSSAPI, правильными функциями SSPI будут MakeSignature и VerifySignature. Имейте в виду, что MakeSignature и VerifySignature не будут взаимодействовать с GSS_Wrap , если conf_flag имеет значение 0 или GSS_Unwrap. То же самое относится и к сочетанию набора EncryptMessage (Kerberos) только для подписи и gss_verify_mic.
Примечание
Не используйте функции MakeSignature или VerifySignature при вызове GSS_Wrap и GSS_Unwrap .
SSPI, эквивалентным GSS_Wrap , является EncryptMessage (Kerberos) для обеспечения целостности и конфиденциальности.
В следующем примере показано использование EncryptMessage (Kerberos) для подписывания данных, которые будут проверены GSS_Unwrap.
В клиенте SSPI:
// Need three descriptors, two for the SSP and
// one to hold the application data.
in_buf_desc.cBuffers = 3;
in_buf_desc.pBuffers = wrap_bufs;
in_buf_desc.ulVersion = SECBUFFER_VERSION;
wrap_bufs[0].cbBuffer = sizes.cbSecurityTrailer;
wrap_bufs[0].BufferType = SECBUFFER_TOKEN;
wrap_bufs[0].pvBuffer = malloc(sizes.cbSecurityTrailer);
// This buffer holds the application data.
wrap_bufs[1].BufferType = SECBUFFER_DATA;
wrap_bufs[1].cbBuffer = in_buf.cbBuffer;
wrap_bufs[1].pvBuffer = malloc(wrap_bufs[1].cbBuffer);
memcpy(wrap_bufs[1].pvBuffer, in_buf.pvBuffer, in_buf.cbBuffer);
wrap_bufs[2].BufferType = SECBUFFER_PADDING;
wrap_bufs[2].cbBuffer = sizes.cbBlockSize;
wrap_bufs[2].pvBuffer = malloc(wrap_bufs[2].cbBuffer);
maj_stat = EncryptMessage(&context,
SignOnly ? KERB_WRAP_NO_ENCRYPT : 0,
&in_buf_desc, 0);
// Send a message to the server.
На сервере GSSAPI:
// Received message is in recv_buf.
maj_stat = gss_unwrap(&min_stat, context, &recv_buf, &msg_buf,
&conf_state, (gss_qop_t *) NULL);
(void) gss_release_buffer(&min_stat, &recv_buf);
// Original message is in msg_buf.
SSPI, эквивалентным GSS_Unwrap, является DecryptMessage (Kerberos). Ниже приведен пример использования DecryptMessage (Kerberos) для расшифровки данных, зашифрованных GSS_Wrap.
На сервере GSSAPI:
// Seal the message.
send_buf.value = msg;
send_buf.length = msglen;
// If encrypt_flag = 1, privacy; encrypt_flag = 0, integrity.
maj_stat = gss_wrap(&min_stat, context, encrypt_flag,
GSS_C_QOP_DEFAULT, &send_buf, &state, &msg_buf);
// The message to send is in msg_buf.
В клиенте SSPI:
wrap_buf_desc.cBuffers = 2;
wrap_buf_desc.pBuffers = wrap_bufs;
wrap_buf_desc.ulVersion = SECBUFFER_VERSION;
// This buffer is for SSPI.
wrap_bufs[0].BufferType = SECBUFFER_STREAM;
wrap_bufs[0].pvBuffer = xmit_buf.pvBuffer;
wrap_bufs[0].cbBuffer = xmit_buf.cbBuffer;
// This buffer holds the application data.
wrap_bufs[1].BufferType = SECBUFFER_DATA;
wrap_bufs[1].cbBuffer = 0;
wrap_bufs[1].pvBuffer = NULL;
maj_stat = DecryptMessage(
&context,
&wrap_buf_desc,
0, // no sequence number
&qop
);
// This is where the data is.
msg_buf = wrap_bufs[1];
// Check QOP of received message.
// If QOP is KERB_WRAP_NO_ENCRYPT, the message is signed only;
// otherwise, it is encrypted.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по