9

我正在新机器上安装 Windows 服务。该服务通过 TCP 上的 SslStream 执行各种操作,该服务使用有问题的证书。

该服务在其他 2 台 windows 2003 机器上使用相同的代码和相同的证书运行良好。但是,这台新机器也是Windows 2003 64 位处理器。

当我尝试使用“服务帐户”身份运行服务时遇到了这个问题。它适用于我自己的凭据。(同样,它在其他 2 台使用此服务帐户的机器上运行良好)

导入证书时我没有启用“强保护”。

这是堆栈跟踪。

System.ComponentModel.Win32Exception:在 System.Net.Security.SecureChannel.AcquireCredentialsHandle(CredentialUse credUsage, SecureCredential&secureCredential) 在 System.Net.Security.SecureChannel.AcquireClientCredentials(Byte[]& thumbPrint) 在 System.Net.Security.SecureChannel.GenerateToken(Byte[] input, Int32 offset, Int32 count, Byte[]& output) 在 System
System.Net.Security.SslState.StartSendBlob(Byte[] 传入,Int32 计数,AsyncProtocolRequest asyncRequest)处的.Net.Security.SecureChannel.NextMessage(Byte[] 传入,Int32 偏移量,Int32 计数)
在 System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
在 System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
在 System.Net.Security .SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
在 System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
在 System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResultlazyResult) 在 System.Net.Security.SslStream.AuthenticateAsClient(String targetHost, X509CertificateCollection clientCertificates, SslProtocols enabledSslProtocols, Boolean checkCertificateRevocation)

4

4 回答 4

11

我发现了问题及其解决方案。

这个想法是授予用于服务身份的帐户的权限。

需要用到一个工具WinHttpCertCfg.exe。这对于使用客户端证书获取授权的应用程序很有帮助。

这里解释得很好。 http://support.microsoft.com/kb/901183

感谢 Feroze Daud ( http://ferozedaud.blogspot.com/ ),他在另一个论坛上回答了我。

于 2010-02-24T18:47:30.820 回答
5

我使用了该线程中的解决方案 -使用 BouncyCastle 生成的证书作为服务器进行身份验证时出现“无法识别提供给包的凭据”错误

短利 说:

  • mmc - 添加/删除管理单元 - 证书 - 添加
  • 打开带有您的证书的菜单。
  • 所有任务 > 管理私钥并设置对每个人或您的应用程序帐户的访问权限。
于 2019-10-15T12:10:31.300 回答
2

在 ASP.NET 帐户下运行或使用 Windows 服务(在本地系统帐户下)时,我都遇到了这个问题。如果您在 ASP.NET 下运行,对于 Windows 2003,您需要使用上面 cdpnet 所述的 WinHttpCertCfg.exe 工具。Windows 2008 R2 允许您使用 GUI 访问权限,这是一个很好的改进。

但是,当作为 Windows 服务运行时,您需要确保证书在个人证书存储中,方法是进入 mmc 并为 Windows 服务帐户添加证书管理单元,或者如果您使用的是“本地系统” ' 帐户,只需获取本地计算机的管理单元。

这是我发现的差异...

如果您已将个人证书安装到您自己用户的证书存储区并将其复制并粘贴到本地计算机存储区,这并不总是有效。但是,如果您从本地计算机存储、个人文件夹中删除证书,则可以右键单击本地计算机存储中的个人文件夹,然后导入并通过向导。

出于某种原因,这修复了它并分配了使用证书的正确权限。祝你好运!

于 2010-11-15T16:16:55.090 回答
0

我正在为 Win 2003 Serv 执行此处描述的操作,但由于 mssg“提供给包的凭据无法识别”,我仍然无法使其工作。

我尝试了上述所有解决方案,但均未成功。

最后我得到了它做以下工作:

  1. makecert -pe -n "CN=CERT" -ss my -sr LocalMachine -a sha1 -sky exchange -eku 1.3.6.1.5.5.7.3.1 -in "CERT" -is MY -ir LocalMachine -sp "Microsoft RSA SChannel加密提供程序”-sy 12 CERT.cer
  2. 使用 MMC 从 Personal 复制到 Trusted Root
  3. 将生成的证书 (.cer) 用于来自服务应用程序的 X509 调用。

为什么......谁知道......很高兴它对我有用......希望这能让其他人更容易

于 2012-02-06T12:37:26.027 回答