获取凭据句柄返回SEC_E_NO_CREDENTIALS错误。

4

我使用 OpenSSL 创建了一个自签名证书,并在 Windows Vista Ultimate 上使用 Certificates MMC 快照 (CertMgr.msc) 将其安装到证书存储中。

我成功地使用 CertOpenSystemStore 打开了证书存储。然后,我可以使用 CertFindCertificateInStore 查找证书。

但是,我不确定这个错误的真正含义,因为我在 MSDN 文档中没有找到答案。

  • 这是证书问题吗?
  • 还是操作系统问题(在这种情况下,它应该是 Windows Server 操作系统才能工作)?

我正在 Delphi 2010 中使用 Win32 API,但 C 示例也可以。

1个回答

8

MSDN中的错误描述相当模糊:

安全包中没有可用的凭据。

据我所知,此错误意味着SSPI SChannel包未找到证书的私钥或证书对于SSL/TLS无效。请确保证书/私钥已加载到PROV_RSA_SCHANNEL加密服务提供程序(CSP)中,而不是增强型CSP。

您应该启用SChannel日志记录以获取(更多)详细的错误信息,请参见如何启用Schannel事件日志记录(KB适用于IIS,但所述方法在计算机上全局启用了Schannel日志记录):

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\SCHANNEL
EventLogging: DWORD = n

该值可以是以下组合:
  • 0: 不记录日志(Windows NT 4 默认)
  • 1: 记录错误消息(Windows 2000 和 Windows XP 默认)
  • 2: 记录警告
  • 4: 记录信息和成功事件
我已经有一段时间没有使用 SSL/TLS 了,但如果我可以给一个建议:搜索“John Banes”的帖子以及你遇到的错误,你可能会找到一些线索。

+1 关于如何启用Schannel登录的链接非常有用。谢谢。 - Len Holgate
你有生成在 Windows Vista 上使用 OpenSSL 生成有效 SSL/TLS 证书的链接吗?使用 Schannel 时有加密级别限制吗?这看起来像是我的问题,但我也正在使用 UNISP_NAME = 'Microsoft Unified Security Protocol Provider',这似乎是唯一可用的。非常感谢任何更多提示,因为我在找到此主题的明确信息方面遇到了困难。 - Bruce
我看到CertOpenStore的hCryptProv参数现在被归类为遗留技术并且应该设为NULL。在Win2k3中,这个参数需要是SChannel CSP,然后结果HCERTSTORE需要作为hCertRoot传递给pAuthData所传递的SCHANNEL_CRED结构体。从我在Vista中的观察来看,他们只支持从MyUser或MyComputer存储库中加载证书,这意味着你不能传入一个任意的证书,但可以传入凭据让系统选择正确的证书。我可能错了,这整个领域在MSDN中非常模糊。 - Remus Rusanu
是的,这听起来很熟悉。据我所知,如果您将Certcontext和CertStore传递给ACH,则证书存储必须是SChannel CSP而不是默认的CSP。打开SChannel日志,在其中详细信息中,您会找到用于查找证书的CSP。您的证书必须加载到 CSP存储中。 - Remus Rusanu
1
由于其他原因,我从使用Vista机器转换到XP机器,然后在XP和Windows 7上使用Windows 7机器,代码运行得非常顺畅。 - Bruce
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接