问题标签 [sspi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2011 浏览

postgresql - PostgreSQL ODBC 连接 SSPI 身份验证失败

我最近对我正在为我们公司维护的现有应用程序进行了一些更改,以尝试改进某些功能。但是,我遇到了一个问题,我无法通过我的所有 Google 搜索找到任何有用的信息。这是平台:

在 Windows 7(64 位)上运行的 VB6 应用程序使用 ADODB 通过 ODBC 连接到 PostgreSQL (v. 9.1.1) 服务器。

问题是,由于某种原因,我使用的 SSPI 身份验证方法似乎无法从 PostgreSQL 数据库中的序列中检索值。其他 (VB.NET) 应用程序使用 SSPI 身份验证毫无问题地连接到同一数据库服务器(使用 Npgsql)。

这是用于 VB6 应用程序中 ODBC 连接的基本连接字符串:

当我尝试连接到数据库后检查 PostgreSQL 服务器日志时,我发现以下错误:

我尝试通过 PGAdmin III 从另一台机器(使用他们的凭据登录)以该用户身份连接到数据库,并且可以正常连接。我实际上在第二台机器(也是 Windows 7 64 位)上尝试了相同的应用程序,它似乎没有给我任何连接错误。

当然,当我通过我的 WinXP VM 上的 VB6 IDE 运行代码时(在我自己的凭据下),一切似乎都按预期工作。我验证了用户的 Active Directory 帐户处于活动状态且已解锁,并且 PostgreSQL 数据库具有使用正确的组角色成员身份创建的正确用户等。所以,显然我的想法是为 PostgreSQL 安装的 ODBC 驱动程序一定有问题。我安装了 64 位 PostgreSQL ODBC 驱动程序,(当然)它没有帮助。我卸载并重新安装了 32 位驱动程序(因为它通过 32 位应用程序运行),但没有任何变化。

这是我用来尝试连接到数据库的 VB6 代码:

我检查了 PostgreSQL 数据库中的序列,并且序列没有增加。出现的错误消息表明该SQLStr变量甚至还没有被填充,这告诉我它Open是在调用该方法时发生的。

我暂时想出了一个“Band-Aid”解决方法:我在 PostgreSQL 服务器上创建了一个新的受限访问用户,该用户使用 MD5 登录(在 pg_hba.conf 中指定)而不是 SSPI,并且将其硬编码在我的连接字符串 ( PGSQL_CONNECTION_STR) 中。据我目前所知,这似乎工作正常,这使我进一步相信该问题与在此环境中使用 SSPI 和 PostgreSQL 的 ODBC 连接器特别相关。

在这一点上,我基本上想知道是否有人可能知道使用 PostgreSQL ODBC 驱动程序通过 SSPI 验证与 PostgreSQL 数据库的连接的特定问题。我更希望不必将凭据硬编码到应用程序中,即使凭据是针对受限访问用户的。我已经尝试了我所知道的一切,尽管我可能没有在上面提到它,所以如果您需要任何澄清,请告诉我。在此先感谢您的帮助。

编辑:我唯一还没有尝试过的是安装 64 位 ODBC 驱动程序并更改我的连接字符串以使用它。我没有尝试过的原因是我们仍然有一些用户尚未升级到 64 位操作系统。如果,也许,我可以找到一种方法来通过 VB6 确定用户是在 32 位还是 64 位操作系统上,这可能是一个可行的替代方案(假设 64 位 ODBC 驱动程序实际上可以正常工作)。

编辑 - 调试日志详细信息(已编辑):

[mylog_3380.log]

[psqlodbc_3380.log]

编辑 - 服务器日志: 这是我测试时的日志条目。这与我之前发布的内容几乎相同,但我前进了几分钟以允许连接超时等。它来自我的 VB6 应用程序中调用存储过程的不同函数,但它导致 SSPI 身份验证出现相同的错误/问题。

我可以尝试打开额外的调试,但我可能需要一点时间才能从中获取任何数据。问题当然有可能(正如您之前建议的那样)与 PostgreSQL 的版本有关,除了这些相同的功能将在安装了相同 ODBC 连接器的 32 位 WinXP 测试环境中正常工作。

编辑 - log_min_messages = debug1:

log_min_messages = debug5

0 投票
1 回答
1330 浏览

kerberos - 使用 SSPI,应该如何将 Kerberos 令牌发送到启用 GSSAPI 的 HTTP 代理服务器?

我有一个简单的客户端套接字应用程序,我想通过它访问网站。为了访问 Internet,我的客户端必须通过 HTTP 代理服务器(我使用的是 Microsoft Forefront 威胁管理网关)。代理服务器需要身份验证,并且被配置为通过 GSSAPI 接受 Kerberos。

在我的客户端中,我使用 Microsoft 的 SSPI:

首先,我调用AcquireCredentialsHandle成功并返回SEC_E_OK

接下来,我调用InitializeSecurityContext也成功并返回SEC_E_OK

到目前为止,一切都很好。但是现在,我需要将令牌提交给代理服务器进行授权,这是给我带来问题的部分。

如果我使用 Internet Explorer 连接到我的代理服务器,我可以通过 Wireshark 观看数据包交换。IE 与 Kerberos 协商票证,并似乎通过 Proxy-Authorization 标头提交票证。标头内容似乎是 base64 编码的。

如果我只是获取从返回的令牌InitializeSecurityContext,base64 对其进行编码并通过类似的标头将结果发送到代理服务器Proxy-Authorization: Negotiate <base64Data>,则身份验证失败。

我觉得我很接近,但仍然缺少一些东西。一个站点讨论了在发送之前在令牌上使用 EncryptMessage。另一个讨论了使用相互身份验证(我不认为 IE 正在使用相互身份验证,因为客户端似乎只发送一次授权,并且没有来自服务器的反馈数据(InitializeSecurityContext第二次调用)另一个站点概述了将令牌与不同的SEC_BUFFER类型(填充、数据等)和加密。我怀疑这是我需要做的,因为我没有找到太多关于如何做的文档。

您可能有任何见解或建议将不胜感激。

2014 年 7 月 19 日更新:为了清楚起见,我在问如何使用 SSPI 来计算“base64Data”字段(如上所述)。虽然计算 SECBUFFER_TOKEN 缓冲区中包含的内容的 base64 编码是我最初的猜测,但服务器不接受结果,因此它显然是无效的。

进一步的研究表明,令牌必须“包装”(又名“EncryptMessage”通过 SSPI)并以与 GSSAPI 兼容的方式加密,必须使用三个缓冲区(按顺序:SECBUFFER_TOKEN、SECBUFFER_DATA 和 SECBUFFER_PADDING)我试过这个昨天,但没有找到成功。

http://msdn.microsoft.com/en-us/library/ms995352.aspx

http://msdn.microsoft.com/en-us/magazine/cc301890.aspx

0 投票
0 回答
2272 浏览

asp.net - APNS 推送通知错误 - 对 SSPI 的调用失败,请参阅内部异常

我知道以前有人问过这个问题,但这些问题似乎都对我没有帮助。

我正在尝试从我的 asp.net 应用程序发送推送通知,但出现以下错误:

这是代码:

我的证书是否有问题,或者为什么会发生这种情况?

我应该使用 p12 文件吗?如果是这样,如果我有 .pem 文件,如何获取 p12 文件?

我正在 Windows 上开发这个,但我应该在 Windows 的某个地方注册证书?

最好的问候,马吕斯。

0 投票
1 回答
253 浏览

windows - SSPI 总是选择 NTLM

我有一个连接到 windows2008-r2 域的 windows7。

每次我尝试 SSPI “Negociate” (C++) 时,我都会退回到 NTLM。

我不明白为什么... DC 上的 DNS 没问题。

有什么事我不做??

如果我运行 klist,我可以看到一切正常,一切似乎都很好(我猜)

更新

好的,现在我才刚刚开始理解(至少)。

我曾经将 SPN "" 提供给InitializeSecurityContext它,在这种情况下,它直接回退到 NTLM。

现在我尝试了,总是在我的客户端上,这个:

这给了我错误 0x8009030c

其他奇怪的东西: 如果我用“管理员”设置 szSPN,现在它可以与 kerberos 一起使用!但是如果我用 JOE 设置 szSPN,它会失败......(假设我在 DC 上创建了一个新用户 JOE)。

哇,我不明白这是怎么回事……!?

0 投票
0 回答
540 浏览

active-directory - 具有错误 SPN 的 SSPI SEC_E_WRONG_PRINCIPAL

使用 SSPI,我正在尝试将我的 win7 连接到 win2008-r2 域控制器。

win7接DC没问题。

所以,在域控制器上我创建了一个新的 SPN

我检查新条目

现在,在客户端我调用 InitializeSecurityContext( hCred, NULL, "test/value" ...

我得到 SEC_E_WRONG_PRINCIPAL

我也尝试了 ldap/vmlab-wdc01.vmlab.local,结果相同如果我只是尝试了“管理员”,它可以工作!

怎么了 ...

0 投票
1 回答
1922 浏览

c# - 对 sspi 的调用失败,请参阅内部异常。在 Windows 7 中收到的消息是意外的或格式错误]

我收到以下错误“对 sspi 的调用失败,看到内部异常。收到的消息在 Windows 7 中是意外的或格式错误”。我尝试了所有可能的方法,但没有运气。请检查一下

这是代码

0 投票
1 回答
889 浏览

c# - 当一个域控制器关闭时,WCF Kerberos SSPI 失败

我的 WCF 服务正在使用带有 Kerberos 的 Windows 身份验证,我们禁用了 NTLM。该服务在一个域用户帐户下运行,而客户端在不同的域用户帐户下运行。两者都使用UPN进行配置。客户端和服务都在同一个域中。并且该域有两个域控制器

当两个域控制器都在线时,客户端和服务之间的通信运行顺利,没有任何问题。如果域控制器之一关闭,我收到以下错误。

对 SSPI 的调用失败,请参阅内部异常。---> System.Security.Authentication.AuthenticationException:对 SSPI 的调用失败,请参阅内部异常。---> System.ComponentModel.Win32Exception:系统检测到可能尝试破坏安全性。请确保您可以联系对您进行身份验证的服务器

请建议我应该怎么做才能消除此错误。谢谢。

0 投票
1 回答
1547 浏览

multithreading - 每个线程在 Win32 中模拟吗?

在调用ImpersonateSecurityContext线程或整个进程中模拟客户端的服务器上调用。该文档对此事有点含糊,因为它声明“该函数创建一个模拟令牌并允许线程或进程在模拟上下文中运行”

我认为模拟仅适用于调用线程,其他任何事情都会很奇怪,但我想确定一下。

0 投票
1 回答
1994 浏览

c# - 具有 SSL 连接的 RabbitMQ 客户端引发 SSPI 异常

在启用 SSL 的情况下使用 RabbitMQ 客户端时,CreateConnection();会引发异常。

内部异常是 SSPI 和内部的令牌无效异常。

RabbitMQ 服务器已经在 java 中进行了测试并且按预期工作,因此问题必须出在 .Net 安全库中。

有谁知道如何解决这个问题?

C#代码:

例外:

爪哇代码:

0 投票
1 回答
236 浏览

database - 功能失调的克隆

已克隆数据库服务器。操作系统是"Microsoft Windows XP Professional Version 2002 Service Pack 3". 查询环境是"Microsoft SQL Server 2008 Management Studio 10.0.4000.0".

克隆后,已注意到以下行为。尝试从机器外部但在同一域内进行连接时,可以读取以下错误消息:"Cannot generate SSPI context. (.Net SqlClient Data Provider)".

"Microsoft SQL Server 2008 Management Studio"从机器内部,可以使用查询环境连接到数据库服务器。

但是,当尝试运行SQLCmd命令行工具时,会显示以下错误:

ServicePrincipalNames设置方式如下:

"C:\PROGRA~1\SUPPOR~1\ADSIEDIT.MSC"从 Microsoft Windows XP Professional 光盘运行支持工具时,我们可以在"ADSI Edit \ Domain [<Site>.<Company>.com] \ DC=<Company>,DC=com"路径下方看到"CN=Computers"叶子。在其"Properties"对话框中,"Security"选项卡内,列表下方"Group or user names:",有"SELF"条目。按下"Advanced"按钮时,"Advanced Security Settings for Computers"会生成对话框。在"Permissions"选项卡上,在"Permission entries:"列表下方,还有一个带有 Name 的条目"SELF"。按下"Edit..."按钮,将"Permission Entry for Computers"显示对话框。在其"Properties"选项卡上的"Permissions:"列表中,没有"Read ServicePrincipalName"权限条目和权限条目"Write ServicePrincipalName"

这可能是以下命令失败的原因:

即使有在ServicePrincipalName克隆的数据库服务器上重置的权限,这是否可以解决SQLCmd同一域内来自机器外部和来自机器外部的连接?