2010-02-23 77 views
7

我正在新机器上安装Windows服务。 该服务通过TCP使用问题中的证书对SslStream进行各种操作。新机器的证书问题 - 提供给包无法识别的凭证

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

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

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

这是堆栈跟踪。

System.ComponentModel.Win32Exception: 供给到 包中的凭据未在 在 System.Net.SSPIWrapper.AcquireCredentialsHandle(SSPIInterface SecModule,字符串包, CredentialUse意图,SecureCredential SCC)识别System.Net.Security.SecureChannel.AcquireCredentialsHandle(CredentialUse credUsage,SecureCredential & secureCredential)在 System.Net.Security.SecureChannel.AcquireClientCredentials(字节[] & 指纹)在 System.Net.Security.SecureChannel.GenerateToken(字节[] 输入,的Int32偏移的Int32计数, 字节[] &输出)在 System.Net.Security.SecureChannel.NextMessage(字节[] 传入,的Int32偏移的Int32计数)
在 System.Net.Security.SslState.StartSendBlob(字节[] 传入,计数的Int32, AsyncProtocolRequest asyncRequest)
在 System.Net.Security.SslState.ProcessReceivedBlob(字节[] buffer,Int32 count, AsyncProtocolRequest asyncRequest)
在 System.Net.Security.SslState.StartReadFrame(字节[] 缓冲器,的Int32的ReadBytes, AsyncProtocolRequest asyncRequest)
在 System.Net.Security.SslState.StartReceiveBlob(字节[] 缓冲器,AsyncProtocolRequest asyncRequest)在 System.Net.Security.SslState.CheckCompletionBeforeNextReceive在 System.Net.Security.SslState.StartSendBlob(ProtocolToken 消息,AsyncProtocolRequest asyncRequest)(字节[] 传入,计数的Int32, AsyncProtocolRequest asyncRequest)
在 System.Net.Security.SslState.ForceAuthentication(布尔 receiveFirst,字节[]缓冲液, AsyncProtocolRequest asyncRequest)
处 System.Net.Security System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)。 SslStream。AuthenticateAsClient(字符串 targetHost,X509CertificateCollection clientCertificates,SslProtocols enabledSslProtocols,布尔 checkCertificateRevocation)

+1

看看第一个搜索结果是:http://www.google .com/search?q =“+凭证+提供给+ +包+ + +不被识别” – 2010-02-23 23:39:13

+0

我曾看过那个论坛主题,Wim。它正确地解释了这里发生的事情。它不适用于我的原因是我必须解决这个问题,因为“服务帐户”不能用于登录到计算机并以该身份安装证书。 但是在下面的文章中提到了解决“永远的人”的正确方法,我在“答案”中发布了这个文章。 – cdpnet 2010-02-24 18:50:48

回答

9

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

的想法是将权限授予其用于服务标识的帐户。

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

它很好地说明如下。 http://support.microsoft.com/kb/901183

感谢Feroze Daud(http://ferozedaud.blogspot.com/),谁在不同的论坛回答了我。

+0

+1感谢您分享解决方案 – 2010-02-25 00:04:34

0

我有过这样的问题,无论是ASP.NET帐户下运行或使用Windows服务(本地系统帐户下)时,时。如果您在ASP.NET下运行,对于Windows 2003,则需要使用上述cdpnet所述的WinHttpCertCfg.exe工具。 Windows 2008 R2允许您使用GUI访问权限,这是一个不错的改进。

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

这里是我发现的区别...

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

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

-1

我在做什么在这里描述了一个Win 2003 Serv,但仍然无法让它工作,因为mssg“提供给包无法识别的凭据”。

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

最后我得到它的工作执行以下操作:

  1. makecert -pe -n “CN = CERT” -ss我-sr LOCALMACHINE -a SHA1 -sky交换-eku 1.3.6.1.5.5。 7.3.1 -in “CERT” -is MY -ir LOCALMACHINE-SP “微软RSA SChannel加密提供程序” -sy 12 CERT.cer
  2. 使用从个人MMC拷贝产生的受信任的根
  3. 使用证书(.CER )从您的服务应用程序的X509电话。

为什么...谁知道.....高兴它为我工作....希望这使得它在其他的要简单