2011年11月10日

解決透過程式新增 X.590 憑證(with private key)之後取不到相關私鑰資料的問題

最近要設計一個 WCF 的服務以方便透過它來取得資料,由於考量安全性的問題,所以需要設計一個驗證機制,檢核通過後才能取得資料,驗證過程則透過 X.509 來作加密的動作,因為客戶的主機要設定 X.509 的憑證不容易,因此想透過程式的方法來新增憑證,程式碼如下:
X509Store store = new X509Store("My", StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);

if (store.Certificates.Find(
     X509FindType.FindBySubjectName, "SubjectName", true).Count == 0)
{
     X509Certificate2 certificate = new X509Certificate2(
          Server.MapPath("~/App_Code/WebService/cert.pfx"), "password");

     store.Add(certificate);
}

store.Close();
在透過程式新增 X.509 憑證後,並使用 WCF 的服務時,則開始顯示下列的錯誤:
System.Security.Cryptography.CryptographicException: 機碼組不存在
而使用 findprivatekey.exe 來找憑證的私鑰,卻得到 Unable to obtain private key file name 的訊息。 研判是憑證與私錀沒有關連在一起,後來在 X509Certificate2 的建構式上找到一個多載方法: X509Certificate2(String, String, X509KeyStorageFlags) 因此將載入憑證的程式碼改為:
X509Certificate2 certificate = new X509Certificate2(
     Server.MapPath("~/App_Code/WebService/cert/cert.pfx"),  
     "password", 
     X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet);
就可以解決上述的問題。

沒有留言:

張貼留言