2010-02-23 40 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電話。

爲什麼...誰知道.....高興它爲我工作....希望這使得它在其他的要簡單

相關問題