【问题标题】:Certificate problem with a new machine - credentials supplied to package not recognized新机器的证书问题 - 提供给包裹的凭据无法识别
【发布时间】:2011-01-20 07:44:24
【问题描述】:

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

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

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

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

这是堆栈跟踪。

System.ComponentModel.Win32Exception: 提供给 包裹未被识别 System.Net.SSPIWrapper.AcquireCredentialsHandle(SSPI 接口 SecModule,字符串包, CredentialUse 意图,SecureCredential scc) 在 System.Net.Security.SecureChannel.AcquireCredentialsHandle(CredentialUse credUsage, 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(字节 [] 缓冲区,Int32 计数, AsyncProtocolRequest asyncRequest)
在 System.Net.Security.SslState.StartReadFrame(字节[] 缓冲区,Int32 读取字节, AsyncProtocolRequest asyncRequest)
在 System.Net.Security.SslState.StartReceiveBlob(字节 [] 缓冲区,AsyncProtocolRequest 异步请求)在 System.Net.Security.SslState.CheckCompletionBeforeNextReceive(协议令牌 消息,AsyncProtocolRequest 异步请求)在 System.Net.Security.SslState.StartSendBlob(字节 [] 传入,Int32 计数, AsyncProtocolRequest asyncRequest)
在 System.Net.Security.SslState.ForceAuthentication(布尔值 接收第一,字节[]缓冲区, AsyncProtocolRequest asyncRequest)
在 System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult 懒惰的结果)在 System.Net.Security.SslStream.AuthenticateAsClient(字符串 目标主机,X509CertificateCollection 客户端证书,SslProtocols enabledSslProtocols,布尔值 checkCertificateRevocation)

【问题讨论】:

  • 看第一个搜索结果:google.com/…"
  • 我看过那个论坛帖子,Wim。它正确地解释了这里发生的事情。它对我不起作用的原因是我必须为“服务帐户”解决这个问题,该帐户不能用于登录机器并以该身份安装证书。但是我在“答案”中发布的以下文章中提到了为“所有人”解决问题的正确方法。

标签: certificate x509certificate sslstream


【解决方案1】:

我找到了问题及其解决方案。

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

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

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

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

【讨论】:

    【解决方案2】:

    我使用了这个帖子的解决方案 - "The credentials supplied to the package were not recognized" error when authenticating as server with certificate generated using BouncyCastle

    简短地说:

    • mmc - 添加/删除管理单元 - 证书 - 添加
    • 用您的证书打开菜单。
    • 所有任务 > 管理私钥并设置对所有人或您的应用帐户的访问权限。

    【讨论】:

      【解决方案3】:

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

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

      这是我发现的不同之处......

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

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

      【讨论】:

      • 删除并重新安装到本地计算机而不是本地用户为我做了。似乎它只会安装链的其他证书,当您仅从本地用户复制到本地计算机时,也许这就是缺少的。
      【解决方案4】:

      我正在为 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 调用。

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

      【讨论】:

        猜你喜欢
        • 2015-09-09
        • 1970-01-01
        • 2014-07-27
        • 1970-01-01
        • 1970-01-01
        • 2021-05-31
        • 1970-01-01
        • 1970-01-01
        • 2011-12-20
        相关资源
        最近更新 更多