2012-05-31 31 views
0

我模擬服務用戶帳戶以連接到需要證書連接的Web服務。我在運行代碼的機器上的服務帳戶上安裝了客戶端證書,但是收到錯誤System.Security.Cryptography.CryptographicException:系統找不到指定的文件。訪問模擬用戶密鑰存儲區

using (var ctx = new ImpersonationContext("svcAcctUserName", "domain", "password")) 
{ 
    var clientCert = new X509Certificate2("filePath", "certPassword"); 
} 

的模擬代碼工作,爲簡潔起見我已經離開它,但我檢查,以確保我的上下文是通過記錄Environment.UserName,這表明我正在爲svcAcctUserName切換到svcAcctUserName用戶。 filePath是正確的,我又把它留了下來,但是我在創建X509Certificate2對象之前打開並關閉了文件,以確保我已經訪問了該文件並且我的路徑是正確的。

該錯誤令人困惑,因爲我將路徑作爲參數提供,並且我確定運行代碼的用戶可以訪問。

編輯:

也試過這樣:How to call a Web service by using a client certificate for authentication in an ASP.NET Web application

雖然我沒有使用asp.net應用程序,我給它一個想試試。我將證書加載項添加到mmc,添加了「本地計算機」證書添加,然後將證書導入到本地計算機的個人存儲中。

我然後跑:

WinHttpCertCfg.exe -g -c LOCAL_MACHINE\My -s issuedToName -a domain\svcAcctUserName 

試圖運行操作一遍,還是同樣的問題。

我錯過了什麼?

+0

你是如何訪問web服務?證書是安裝在密鑰庫中還是隻安裝在文件系統中? – Brian

+0

它位於模擬服務帳戶的個人密鑰存儲區中,並位於local_machines密鑰存儲區中,授權通過模擬用戶訪問它。請參閱下面的我嘗試過的內容。 – Bitfiddler

+0

您的示例演示使用文件路徑調用X509Certificate2的構造函數,但您正在討論商店中的證書......請對齊您的問題和示例代碼以討論相同的事情。 –

回答

1

因此,正如Alex所指出的那樣,我不明白windows中證書系統的底層架構。但是,在執行上述步驟並修改我的代碼以使用X509Store之後,我開始工作。希望這將有助於某人:

using (var ctx = new ImpersonationContext("svcAcctUserName", "domain", "password")) 
{ 
    var store = new X509Store(StoreLocation.LocalMachine); 
    store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); 
    var clientCert = store.Certificates.Find(X509FindType.FindByIssuerName, "IssuerNameHere", false); 
    var clientCert2 = new X509Certificate2(clientCert[0]); 
} 
+0

+1發佈解決方案(隨時接受 - 可以這樣做)。注意:對於原始問題的大小(非評論)有非常寬鬆的限制,因此請在此處更新問題。即使有1個聲望,你也可以自由編輯你的問題。把代碼放在評論中會更糟......當你用你以前的評論「回答」自己的問題時,你基本上已經讓很多人跳過你「回答」了問題,從而降低了得到答案的機會。 –

+0

不幸的是我不能接受我自己的答案。但是我發現,當人們不斷迴應評論時編輯他們的原始問題時,這使得後來嘗試追蹤解決方案流程的人很難遵循。我更喜歡知道人們是如何得到解決方案的,多次旅程與答案一樣具有啓發性,但是當你有一個問題被編輯了5次以迴應評論時,很難對發生的順序進行逆向工程。 – Bitfiddler

+0

另外,我根本沒有注意到積分系統,所以我不特別擔心如果有人不正確地標記我的答案。如果我的解決方案被閱讀並且幫助某人......很好。不管我是否得到信用(儘管信用是受歡迎的)。 – Bitfiddler

相關問題