/// <summary> /// Browses for a certificate to import. /// </summary> private void ImportApplicationCertificateBTN_Click(object sender, EventArgs e) { try { // get application. ManagedApplication application = ApplicationToManageCTRL.GetSelectedApplication();; if (application == null) { return; } // load the configuration. application.Reload(); // can't set application certificate for non-sdk apps. if (!application.IsSdkCompatible) { return; } // set current directory. if (m_currentDirectory == null) { m_currentDirectory = Utils.GetAbsoluteDirectoryPath("%CommonApplicationData%\\OPC Foundation\\CertificateStores\\MachineDefault", false, false); } if (m_currentDirectory == null) { m_currentDirectory = new FileInfo(Application.ExecutablePath).DirectoryName; } // open file dialog. OpenFileDialog dialog = new OpenFileDialog(); dialog.CheckFileExists = true; dialog.CheckPathExists = true; dialog.DefaultExt = ".pfx"; dialog.Filter = "PKCS#12 Files (*.pfx)|*.pfx|All Files (*.*)|*.*"; dialog.Multiselect = false; dialog.ValidateNames = true; dialog.Title = "Open Application Certificate File"; dialog.FileName = null; dialog.InitialDirectory = m_currentDirectory; dialog.RestoreDirectory = true; if (dialog.ShowDialog() != DialogResult.OK) { return; } FileInfo fileInfo = new FileInfo(dialog.FileName); m_currentDirectory = fileInfo.Directory.FullName; CertificateStoreIdentifier store = GetDefaultStore(application, true); // prompt for the store to import into. store = new CertificateStoreDlg().ShowDialog(store); if (store == null) { return; } m_currentStore = store; string password = String.Empty; X509Certificate2 certificate = null; do { try { // load the certificate. certificate = new X509Certificate2( fileInfo.FullName, password, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet); if (!certificate.HasPrivateKey) { MessageBox.Show("Certificate does not have a private key.", "Import Certificate", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } // import certificate. ICertificateStore physicalStore = store.OpenStore(); physicalStore.Add(certificate); physicalStore.Close(); break; } catch (System.Security.Cryptography.CryptographicException exception) { // prompt for password. password = new PasswordDlg().ShowDialog(password, exception.Message); if (password == null) { return; } } } while (true); UpdateApplicationCertificate(application.Application, store, certificate); } catch (Exception exception) { GuiUtils.HandleException(this.Text, MethodBase.GetCurrentMethod(), exception); } }
private void ExportPrivateKeyBTN_Click(object sender, EventArgs e) { try { const string caption = "Select Certificate to Export"; CertificateStoreIdentifier store = new CertificateStoreIdentifier(); store.StoreType = ManagedStoreCTRL.StoreType; store.StorePath = ManagedStoreCTRL.StorePath; CertificateIdentifier id = new CertificateListDlg().ShowDialog(store, true); if (id == null) { return; } X509Certificate2 certificate = id.Find(false); if (certificate == null) { MessageBox.Show( this, "Certificate does not exist or its private key cannot be accessed.", caption, MessageBoxButtons.OK, MessageBoxIcon.Information); return; } string displayName = null; foreach (string element in Utils.ParseDistinguishedName(certificate.Subject)) { if (element.StartsWith("CN=")) { displayName = element.Substring(3); break; } } StringBuilder filePath = new StringBuilder(); if (!String.IsNullOrEmpty(displayName)) { filePath.Append(displayName); filePath.Append(" "); } filePath.Append("["); filePath.Append(certificate.Thumbprint); filePath.Append("].pfx"); SaveFileDialog dialog = new SaveFileDialog(); dialog.CheckFileExists = false; dialog.CheckPathExists = true; dialog.DefaultExt = ".pfx"; dialog.Filter = "PKCS#12 Files (*.pfx)|*.pfx|All Files (*.*)|*.*"; dialog.ValidateNames = true; dialog.Title = "Save Private File"; dialog.FileName = filePath.ToString(); dialog.InitialDirectory = m_currentDirectory; if (dialog.ShowDialog() != DialogResult.OK) { return; } string password = new PasswordDlg().ShowDialog(null, "Password recommended"); FileInfo fileInfo = new FileInfo(dialog.FileName); m_currentDirectory = fileInfo.DirectoryName; // save the file. using (Stream ostrm = fileInfo.Open(FileMode.Create, FileAccess.ReadWrite, FileShare.None)) { byte[] data = certificate.Export(X509ContentType.Pkcs12, password); ostrm.Write(data, 0, data.Length); } // save the public key. string fileRoot = fileInfo.FullName.Substring(0, fileInfo.FullName.Length - fileInfo.Extension.Length); fileRoot += ".der"; using (Stream ostrm = File.Open(fileRoot, FileMode.Create, FileAccess.ReadWrite, FileShare.None)) { byte[] data = certificate.RawData; ostrm.Write(data, 0, data.Length); } // check if original certificate should be deleted. if (new YesNoDlg().ShowDialog("Delete original certificate?", caption) == DialogResult.Yes) { ICertificateStore physicalStore = id.OpenStore(); try { physicalStore.Delete(certificate.Thumbprint); } finally { physicalStore.Close(); } } } catch (Exception exception) { GuiUtils.HandleException(this.Text, MethodBase.GetCurrentMethod(), exception); } }