一樁由X509Certificate2引起的血案

A process serving application pool 'XXXX' suffered a fatal communication error with the Windows Process Activation Service. The process id was '10740'. The data field contains the error number.

在某次網站更新後,發現wcf服務不可用了,連續調用5次後就出現503錯誤了,檢查服務器上的日誌和事件,發現上面的警告,網上查了下,有各類解決方法,但是都無論用,因而逐行代碼輸出日誌看看問題出在哪裏,結果發現是X509Certificate2這個類引起的異常。服務器

1 X509Certificate2(String, SecureString)

新實例初始化 X509Certificate2 類使用的證書文件名稱和密碼。app

2 X509Certificate2(String, SecureString, X509KeyStorageFlags)

新實例初始化 X509Certificate2 類使用的證書文件名稱、 密碼和密鑰存儲標記。函數

在msdn上能夠看到這個類有這麼兩個構造函數,區別就在網站

X509KeyStorageFlags

 這是它的枚舉值:ui

成員名稱 說明
  DefaultKeySet

使用默認的密鑰集。用戶密鑰集一般爲默認值。加密

  Exportable

導入的密鑰被標記爲可導出。spa

  MachineKeySet

私鑰存儲在本地計算機存儲區而不是當前用戶存儲區。日誌

  PersistKeySet

導入證書時會保存與 PFX 文件關聯的密鑰。code

  UserKeySet

私鑰存儲在當前用戶存儲區而不是本地計算機存儲區。既使證書指定密鑰應存儲在本地計算機存儲區,私鑰也會存儲到當前用戶存儲區。blog

  UserProtected

經過對話框或其餘方法,通知用戶密鑰被訪問。使用的加密服務提供程序 (CSP) 定義確切的行爲。

能夠看到默認的枚舉是使用DefaultKeySet,當使用第一個構造函數的時候就是使用的用戶存儲區的證書,當服務部署在IIS上的時候,若是沒有導入證書,調用服務的時候會沒有響應,注意是沒有響應,並且程序不報任何錯誤,在系統事件裏能夠看到上面的警告信息,連續調用5次失敗後,程序的應用程序池被自動關閉,這個是在應用程序池中的默認設置。將代碼修改使用第二種構造函數後問題解決。

這個類的構造函數奇怪之處在於第一個參數都已經提供了證書的地址,第二個參數是證書密碼,若是調用第一個構造函數居然還要去用戶存儲區中讀取證書。

更奇怪的是部署在Windows服務中使用第一個構造函數是沒有問題的,只有發佈到IIS須要使用第二個構造函數。

相關文章
相關標籤/搜索