主体名称

要使客户端与服务器程序创建相互身份验证的会话,它必须提供服务器的预期主体名称。 某些协议(如 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 符号 (@) ,则主体名称为 msstd:email name。 否则,它必须包含公用名属性。 内部反斜杠会加倍,就像在字符串绑定中一样。
  • 第二个 SCHANNEL 主体名称形式是 完整 格式。 这是一系列符合 RFC1779 的名称,由尖括号限定,并用反斜杠分隔。 它通常遵循模式 fullsic:\\<Authority\SubAuthority\.....\Person> 或 fullsic:\<\Authority\SubAuthority\.....\ServerProgram>。

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

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

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