主体名称

若要使客户端与服务器程序创建相互身份验证的会话,它必须提供服务器的预期主体名称。 某些协议(如 Kerberos)需要任何经过身份验证的会话的正确服务器主体名称。 主体是安全系统识别的实体。 这包括人工用户以及系统服务。 所有主体名称都采用与给定安全支持提供程序(SSP)类似的格式。 SSP 是执行安全验证的软件模块。 有关详细信息,请参阅 SSPI 体系结构概述。 为了保持一致性,安全提供程序通常为系统服务提供与用户类似的名称。 在某些安全提供程序下,系统服务可能没有主体名称。

服务器使用 RpcServerRegisterAuthInfo 函数为安全提供程序注册其主体名称。 每个安全提供程序只能使用一个服务器主体名称。 如果注册了多个名称,则会随机选择并使用一个名称。 SSP 指示主体名称的格式。 例如,系统服务的 Kerberos/Negotiate SSP 大致如下所示:machine_name$@childdomain.parentdomain1.parentdomain2.COM。

生成主体名称的建议过程是使用记录的 API(如 DsMakeSpn 函数),而不是将主体名称从字符串中拼凑在一起。 使用记录的 API 可提高不同部署环境之间的可移植性,并消除错误的可能性。

指定不正确的主体名称可能会阻止客户端和服务器建立经过身份验证的会话。 SCHANNEL SSP 采用两种形式之一的主体名称:

  • 第一个 SCHANNEL 主体名称窗体是 msstd 窗体。 msstd 格式的名称通常遵循模式 msstd:servername@serverdomain.com。 这称为电子邮件名称属性。 如果证书包含电子邮件名称属性,并且它包含 at sign (@),则主体名称为 msstd:email 名称。 否则,它必须包含公用名属性。 内部反斜杠是双倍的,就像在字符串绑定中一样。
  • 第二个 SCHANNEL 主体名称窗体是完整窗体。 这是一系列符合RFC1779的名称,由尖括号绑定,并用反斜杠分隔。 它通常遵循模式 fullsic:\<\Authority\SubAuthority\.....\Person> 或 fullsic:\<\Authority\SubAuthority\.....\ServerProgram>。

如果名称与证书不匹配,则返回ERROR_ACCESS_DENIED。 如果名称格式无效,SCHANNEL SSP 将返回代码ERROR_INVALID_PARAMETER。

若要查询服务器的主体名称,应用程序可以调用 RpcMgmtInqServerPrincName。 这会分配以 null 结尾的字符串来保存主体名称。 在终止应用程序之前,应用程序必须调用 RpcStringFree 才能释放此字符串占用的内存。

以这种方式查询服务器名称是不安全的,应避免。 对于服务器身份验证,客户端程序应知道要连接到的服务器,并且应从头开始创建服务器主体名称。