Solaris 开发者安全性指南

在 GSS-API 中接受上下文

建立上下文的另一方面是接受上下文,这可通过 gss_accept_sec_context() 函数来完成。 通常情况下,服务器接受客户机使用 gss_init_sec_context() 已启动的上下文。

gss_accept_sec_context() 的主要输入是来自启动器的输入令牌。 启动器会返回一个上下文句柄,以及一个要返回到启动器的输出令牌。 但是,服务器应当首先获取客户机所请求服务的凭证,然后才能调用 gss_accept_sec_context()。 服务器使用 gss_acquire_cred() 函数获取这些凭证。 或者,服务器可以指定在调用 gss_accept_sec_context() 时的缺省凭证(即 GSS_C_NO_CREDENTIAL),从而无需明确获取凭证。

调用 gss_accept_sec_context() 时,服务器可以按如下方式设置以下参数:

以下几段将介绍完整的 gss_accept_sec_context() 参数集。

建立安全上下文可能需要几次握手。 启动器和接受器通常需要先发送多段上下文信息,然后才能建立完整的上下文。 因此,为了实现可移植性,应始终在检查上下文是否已完全建立的循环过程中接受上下文。 如果上下文尚未建立,则 gss_accept_sec_context() 将返回一个主状态码 GSS_C_CONTINUE_NEEDED。 因此,循环应当使用 gss_accept_sec_context() 的返回值来测试是否继续执行接受循环操作。

上下文接受器将上下文信息以输出令牌形式返回到启动器,输出令牌通过 gss_accept_sec_context() 返回。 以后,接受器可以从启动器接收输入令牌形式的其他信息。 以后调用 gss_accept_sec_context() 时,输入令牌将作为参数传递。 gss_accept_sec_context() 不再向启动器发送令牌时,将返回一个长度为零的输出令牌。 除了检查返回状态 gss_accept_sec_context() 以外,循环还应当检查输出令牌的长度,查看是否必须发送其他令牌。 开始循环之前,应将输出令牌的长度初始化为零。 请将输出令牌设置为 GSS_C_NO_BUFFER 或者将结构的长度字段设置为零值。

下面的伪代码举例说明如何从服务器端建立上下文:

context = GSS_C_NO_CONTEXT

output token = GSS_C_NO_BUFFER



do



     receive an input token from the initiator



     call gss_accept_sec_context(context, cred handle, input token,

                                                output token, other args...)



     if (there's an output token to send to the initiator)

          send the output token to the initiator

          release the output token



     if (there's a GSS-API error)

          delete the context



until the context is complete

错误检查范围越大,实际循环将越完整。有关此类上下文接受循环的实际示例,请参见建立与服务器的安全上下文。此外,gss_accept_sec_context() 手册页还提供了一个示例。

同样,GSS-API 不会收发令牌,令牌必须由应用程序进行处理。有关令牌传送函数的示例可以在各种 GSS-API 样例函数中找到。

gss_accept_sec_context() 在成功完成时将返回 GSS_S_COMPLETE。如果上下文不完整,该函数将返回 GSS_S_CONTINUE_NEEDED。如果出现错误,该函数将返回错误代码。有关更多信息,请参见 gss_accept_sec_context(3GSS) 手册页。