public bool AddContactCertificate(string strContactID, X509Certificate cert) { if (strContactID == null || strContactID.Length == 0) { throw new ArgumentException("Invalid contact ID", "strContactID"); } if (cert == null) { throw new ArgumentNullException("cert", "Invalid Contact X509 Certificate"); } // Prevent any attempt to add multiple certificates for a contact if (IsContactCertificateInStore(strContactID)) { return(true); } bool bRetVal = true; // Use CAPICOM (v2.0) support to add certificate StoreClass store = new StoreClass(); store.Open(CAPICOM_STORE_LOCATION.CAPICOM_LOCAL_MACHINE_STORE, X509CertificateStore.MyStore, CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_EXISTING_ONLY | CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED ); // Store certificate // Convert cert to base64 string string strBase64Cert = cert.ToBase64String(); // Save to temp file string strTempFile = Guid.NewGuid().ToString(); StreamWriter sw = new StreamWriter(File.Create(strTempFile)); sw.Write(strBase64Cert); sw.Flush(); sw.Close(); // Load cert from temp file store.Load(strTempFile, Constants.DEFAULT_CERT_PSWD, CAPICOM_KEY_STORAGE_FLAG.CAPICOM_KEY_STORAGE_DEFAULT | CAPICOM_KEY_STORAGE_FLAG.CAPICOM_KEY_STORAGE_EXPORTABLE); // Delete temp file File.Delete(strTempFile); // Close store store.CloseHandle(store.StoreHandle); // Return true return(bRetVal); }
public bool RemoveContactCertificate(string strContactID) { if (strContactID == null || strContactID.Length == 0) { throw new ArgumentException("Invalid contact ID", "strContactID"); } // Prevent any attempt to add multiple certificates for a contact if (!IsContactCertificateInStore(strContactID)) { return(true); } bool bRetVal = true; // Use CAPICOM (v2.0) support to remove certificate StoreClass store = new StoreClass(); store.Open(CAPICOM_STORE_LOCATION.CAPICOM_LOCAL_MACHINE_STORE, X509CertificateStore.MyStore, CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_EXISTING_ONLY | CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED ); // Remove "CN=" prefix from contact ID // Hack because CAPICOM Find by Subject name will not ignore the "CN=" // unlike Microsoft.Web.Services.Security.X509.X509CertificateStore int nStart = strContactID.LastIndexOf("="); strContactID = strContactID.Substring(nStart + 1); // Find the cert to remove Certificates certCol = ((Certificates)store.Certificates).Find(CAPICOM_CERTIFICATE_FIND_TYPE.CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME, strContactID, false); IEnumerator it = certCol.GetEnumerator(); while (it.MoveNext()) { store.Remove((Certificate)it.Current); } // Close store store.CloseHandle(store.StoreHandle); return(bRetVal); }