2015-10-07 75 views
2

在我的ASP.NET應用程序中我加載從證書存儲的證書:證書私鑰下,IIS Web服務器將引發CryptographicException

var myCert = CertificateUtils.GetCertificate("thumbprint"); 

此證書包含一個密鑰對用於解密的加密應用設置。

證書安裝在個人證書商店下的本地計算機。當應用程序在IIS Express下運行時,它運行良好。但如果我在完整IIS Web服務器下執行它,myCert實例是缺少私鑰

myCert對象的PrivateKey字段包含一個例外:

'myCert.PrivateKey' threw an exception of type 'System.Security.Cryptography.CryptographicException' 

我已通過檢查確認myCert對象的其他字段包含相同的值(如,例如,證書序列號,指紋或到期),所以它似乎它在IISIIS Express下獲得相同的證書。在完整IIS的情況下,只有私鑰丟失。

我唯一改變的是項目屬性中的Local Development Server(「使用IIE Express」/「使用IIS Web服務器」)。在兩種情況下,它都在Azure仿真器Express內部運行。

有沒有人有一個想法,爲什麼這會發生?

回答

5

在IIS Express上運行時,程序使用您的憑據訪問證書,而在IIS上使用池身份憑證。您可以輕鬆地檢查證書ACL以查看是否允許誰。

遵循以下步驟:

  1. 檢查哪些應用程序池您的網站使用

    打開Internet信息服務管理器,在連接選擇網站左側樹。在中間面板中選擇您的網站並點擊基本設置根據操作在右側面板上。

  2. 檢查什麼身份的應用程序池使用

    選擇應用程序池連接左側樹,發現在中間面板的身份。這可能是「網絡服務」。

  3. 爲使用應用程序池到您的證書

    打開Microsoft管理控制檯mmc)的身份,加上證書管理單元在本地計算機帳戶,發現添加讀取權限您證書在個人證書。打開其上下文菜單所有任務管理私鑰...。點擊添加..,輸入身份(「NETWORK SERVICE」)並點擊檢查名稱確定權限只允許閱讀權限。

    您可以在這個問題看細節:How to give ASP.NET access to a private key in a certificate in the certificate store?

+0

我明白了。這確實是有道理的。但是,我能做些什麼來在完整的IIS下使用該證書和密鑰? –

+1

@DawidFerenczy你可以授予池身份證書訪問權限。在mmc的證書管理管理單元中這樣做很容易。 –

+0

好的,所以我確定了用於我的應用程序的應用程序池。此應用程序池的標識設置爲「NetworkService」,因此我需要授予該帳戶的證書訪問權限,對不對?我已經檢查了MMC中的證書,但我無法找到配置權限的位置。請問你能幫幫我嗎?我還需要什麼權限? –

0

我是有這個問題來調試應用程序「.PrivateKey‘扔類型的異常’System.Security.Cryptography.CryptographicException」 我解決像這樣:

在mmc>本地計算機>個人>證書>右鍵單擊證書>所有任務>管理私鑰: 添加「everyone」用戶並選擇Total Control。

+0

此解決方案在我的場景中不起作用。我已經爲幾乎IUSRS,每個人,IUSR ...設置了最高權限,但仍然是「store.storehandle拋出了system.security.cryptography.cryptographicexception類型的異常「被解僱..任何意見..高度讚賞。 – Amruta