Solaris 开发者安全性指南

在 GSS-API 中启动上下文

gss_init_sec_context() 函数用于启动应用程序和远程服务器之间的安全上下文。 如果成功,该函数将返回一个上下文句柄以建立上下文,还将返回一个要发送到接受器的上下文级别的令牌。 调用 gss_init_sec_context() 之前,客户机应当执行以下任务:

  1. 使用 gss_acquire_cred() 获取凭证(如有必要)。 通常,客户机会在登录时接收凭证。gss_acquire_cred() 只能从正在运行的操作系统中检索初始凭证。

  2. 使用 gss_import_name() 以 GSS-API 内部格式导入服务器的名称。 有关名称和 gss_import_name() 的更多信息,请参见GSS-API 中的名称

调用 gss_init_sec_context() 时,客户机通常会传递以下参数值:

应用程序不一定要使用这些缺省值。 此外,客户机还可以使用 req_flags 参数指定其他安全参数的要求。 下面描述了完整的 gss_init_sec_context() 参数集。

上下文接受器可能需要多次握手才能建立上下文, 也即是说,接受器会要求启动器先发送多段上下文信息,然后再建立完整的上下文。 因此,为了实现可移植性,应始终在检查上下文是否已完全建立的循环过程中启动上下文。

如果上下文不完整,则 gss_init_sec_context() 将返回一个主状态码 GSS_C_CONTINUE_NEEDED。 因此,循环应当使用 gss_init_sec_context() 的返回值来测试是否继续执行启动循环操作。

客户机将上下文信息以输出令牌形式传递到服务器,输出令牌通过 gss_init_sec_context() 返回。 客户机可接收从服务器返回的输入令牌形式的信息。 以后调用 gss_init_sec_context() 时,输入令牌可以作为参数传递。 但是,如果所收到的输入令牌的长度为零,则表明服务器不再需要其他输出令牌。

因此,除了检查 gss_init_sec_context() 的返回状态以外,该循环还应当检查输入令牌的长度。 如果长度是非零值,则需要向服务器发送其他令牌。 开始循环之前,应将输入令牌的长度初始化为零。 请将输入令牌设置为 GSS_C_NO_BUFFER 或者将结构的长度字段设置为零值。

下面的伪代码举例说明如何从客户端建立上下文:

context = GSS_C_NO_CONTEXT

input token = GSS_C_NO_BUFFER



do



     call gss_init_sec_context(credential, context, name, input token, 

                                           output token, other args...)



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

          send the output token to the acceptor

          release the output token



     if (the context is not complete)

          receive an input token from the acceptor



     if (there's a GSS-API error)

          delete the context



until the context is complete

错误检查范围越大,实际循环将越完整。 有关此类上下文启动循环的实际示例,请参见建立与服务器的安全上下文。 此外,gss_init_sec_context(3GSS) 手册页还提供了比较特殊的示例。

通常,在上下文未完全建立时返回的参数值即是那些会在上下文完整建立时返回的值。 有关更多信息,请参见 gss_init_sec_context() 手册页。

如果 gss_init_sec_context() 成功完成,则将返回 GSS_S_COMPLETE。 如果对等应用程序需要上下文建立令牌,则将返回 GSS_S_CONTINUE_NEEDED。 如果出现错误,则将返回 gss_init_sec_context(3GSS) 手册页中所示的错误代码。

如果上下文启动失败,则客户机会断开与服务器的连接。