最近要設計一個 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);
就可以解決上述的問題。
沒有留言:
張貼留言