2

我正在使用 DCOM 在 Windows 网络上提供各种应用程序服务,使用 Kerberos 来处理身份验证。系统通常工作正常,但我遇到了从单独的(受信任的)域访问服务的问题。特别是,服务无法回调客户端应用程序,收到错误“发生安全包特定错误”。此外,如果我调整服务以明确要求 Kerberos 身份验证(而不是使用 SNEGO/negotiate),客户端甚至无法调用服务器(再次收到“发生安全包特定错误”)。

令人困惑的是,事情已经运行多年没有问题。但是,与我们之前所做的相比,这里有一些不同之处。一方面,所涉及的服务器运行的是我以前没有使用过的 Windows 2008。此外,如上所述,仅当从单独域的帐户访问服务时才会发生错误,并且以前的使用从未尝试过此操作。

现在问题是:我没有为此 DCOM 服务使用 SPN(服务主体名称),但一些错误和事件日志让我认为这可能是问题所在。但是,我发现的所有文档都不清楚这是否正确,或者如果我确实需要它,我将如何设置 SPN。有人确定 SPN 是否是我在这里缺少的吗?如果是这样,你能指出我应该如何做吗?

额外细节:

对于服务器设置为强制 Kerberos 身份验证的场景,打开Extended RPC Debugging会提供一些额外的线索。客户端可以使用 CoCreateInstanceEx 成功连接,但服务接口上的调用会失败,如上所述。RPC 错误记录在位置 140 处显示错误,错误代码为 0x80090303(“指定的目标未知或无法访问”),该记录的第三个参数是空字符串。这表明缺少 SPN 是罪魁祸首。

4

3 回答 3

1

编辑:看起来我可能对此有些误解。我发现至少有一个网站声明DCOM 会自动为您处理 SPN(请参见页面底部),并且我确认如果客户端要求 Kerberos 身份验证并使用“主机/[计算机名]”作为 SPN,他们可以成功连接。


如果在 DCOM 服务器进程中调用 CoInitializeSecurity 时明确要求 Kerberos 身份验证,则该服务看起来确实需要 SPN。对我来说,电话看起来像这样:

警告:请不要在未确保这些值适合您的安全需求的情况下直接复制此代码。

SOLE_AUTHENTICATION_SERVICE sas;
sas.dwAuthnSvc = RPC_C_AUTHN_GSS_KERBEROS;
sas.dwAuthzSvc = RPC_C_AUTHZ_NONE;
sas.pPrincipalName = L"myservice/mymachine";
sas.hr = S_OK;
CoInitializeSecurity( 0, 1, &sas, 0, RPC_C_AUTHN_LEVEL_DEFAULT,
    RPC_C_IMP_LEVEL_DEFAULT, 0, EOAC_NONE, 0 );

可以使用 配置 SPN setspn,如下所示:

setspn -A myservice/mymachine serviceusername

(有关详细信息,请参阅 setspn 文档)。

不幸的是,这仍然没有解决我的问题,但我认为剩下的问题与测试机器的一些特定问题有关。

于 2009-02-05T17:52:21.923 回答
1

就其价值而言,Kerberos 根据定义需要 SPN。您也许可以利用内置的 SPNS (host/) 和 host 所暗示的各种风格(此别名翻译存储在 AD 中,但对于我的生活,我似乎无法找到列出在哪里的文章这是找到的)。

我将从查看跨域身份验证开始 - 使用 kerberos 可能会很棘手。我首先在客户端和服务器上打开完整的kerberos 日志记录,看看是否有任何结果。

于 2009-03-18T20:25:57.870 回答
1

我在尝试创建远程 COM 对象的实例时遇到了这个错误。如果客户端在调用 CoInitializeSecurity() 期间使用“委托”模拟级别,并且 COM+ 服务在域级别没有“委托”权限​​的用户帐户下运行,我们可能会遇到此错误。

于 2015-07-07T09:53:31.283 回答