/// <summary> /// Displays the dialog. /// </summary> public CertificateIdentifier ShowDialog(SecuredApplication configuration) { CertificateStoreCTRL.StoreType = null; CertificateStoreCTRL.StorePath = null; IssuerKeyFilePathTB.Text = null; IssuerPasswordTB.Text = null; ApplicationNameTB.Text = null; ApplicationUriTB.Text = null; SubjectNameTB.Text = null; DomainsTB.Text = System.Net.Dns.GetHostName(); KeySizeCB.SelectedIndex = 0; LifeTimeInMonthsUD.Value = 60; if (configuration != null) { ApplicationNameTB.Text = configuration.ApplicationName; ApplicationUriTB.Text = configuration.ApplicationUri; if (configuration.ApplicationCertificate != null) { CertificateStoreCTRL.StoreType = configuration.ApplicationCertificate.StoreType; CertificateStoreCTRL.StorePath = configuration.ApplicationCertificate.StorePath; UpdateWithCertificate(configuration.ApplicationCertificate.Find()); } } if (ShowDialog() != DialogResult.OK) { return null; } return m_certificate; }
/// <summary> /// Updates the XML document with the new configuration information. /// </summary> private static void UpdateDocument(XmlElement element, SecuredApplication application) { for (XmlNode node = element.FirstChild; node != null; node = node.NextSibling) { if (node.Name == "ApplicationName" && node.NamespaceURI == Namespaces.OpcUaConfig) { node.InnerText = application.ApplicationName; continue; } if (node.Name == "ApplicationUri" && node.NamespaceURI == Namespaces.OpcUaConfig) { node.InnerText = application.ApplicationUri; continue; } if (node.Name == "SecurityConfiguration" && node.NamespaceURI == Namespaces.OpcUaConfig) { SecurityConfiguration security = (SecurityConfiguration)GetObject(typeof(SecurityConfiguration), node); if (application.ApplicationCertificate != null) { security.ApplicationCertificate = SecuredApplication.FromCertificateIdentifier(application.ApplicationCertificate); } security.TrustedIssuerCertificates = SecuredApplication.FromCertificateStoreIdentifierToTrustList(application.IssuerCertificateStore); security.TrustedIssuerCertificates.TrustedCertificates = SecuredApplication.FromCertificateList(application.IssuerCertificates); security.TrustedPeerCertificates = SecuredApplication.FromCertificateStoreIdentifierToTrustList(application.TrustedCertificateStore); security.TrustedPeerCertificates.TrustedCertificates = SecuredApplication.FromCertificateList(application.TrustedCertificates); security.RejectedCertificateStore = SecuredApplication.FromCertificateStoreIdentifier(application.RejectedCertificatesStore); node.InnerXml = SetObject(typeof(SecurityConfiguration), security); continue; } if (node.Name == "ServerConfiguration" && node.NamespaceURI == Namespaces.OpcUaConfig) { ServerConfiguration configuration = (ServerConfiguration)GetObject(typeof(ServerConfiguration), node); SecuredApplication.FromListOfBaseAddresses(configuration, application.BaseAddresses); configuration.SecurityPolicies = SecuredApplication.FromListOfSecurityProfiles(application.SecurityProfiles); node.InnerXml = SetObject(typeof(ServerConfiguration), configuration); continue; } else if (node.Name == "DiscoveryServerConfiguration" && node.NamespaceURI == Namespaces.OpcUaConfig) { DiscoveryServerConfiguration configuration = (DiscoveryServerConfiguration)GetObject(typeof(DiscoveryServerConfiguration), node); SecuredApplication.FromListOfBaseAddresses(configuration, application.BaseAddresses); configuration.SecurityPolicies = SecuredApplication.FromListOfSecurityProfiles(application.SecurityProfiles); node.InnerXml = SetObject(typeof(DiscoveryServerConfiguration), configuration); continue; } } }
/// <summary> /// Updates the security configuration for an application identified by a file or url. /// </summary> /// <param name="filePath">The file path.</param> /// <param name="configuration">The configuration.</param> public void WriteConfiguration(string filePath, SecuredApplication configuration) { if (configuration == null) { throw new ArgumentNullException("configuration"); } // check for valid file. if (String.IsNullOrEmpty(filePath) || !File.Exists(filePath)) { throw ServiceResultException.Create( StatusCodes.BadNotReadable, "Cannot find the configuration file: {0}", configuration.ConfigurationFile); } // load from file. XmlDocument document = new XmlDocument(); document.Load(filePath); XmlElement element = Find(document.DocumentElement, "SecuredApplication", Namespaces.OpcUaSecurity); // update secured application. if (element != null) { configuration.LastExportTime = DateTime.UtcNow; element.InnerXml = SetObject(typeof(SecuredApplication), configuration); } // update application configuration. else { UpdateDocument(document.DocumentElement, configuration); } try { // update configuration file. Stream ostrm = File.Open(filePath, FileMode.Create, FileAccess.Write); XmlTextWriter writer = new XmlTextWriter(ostrm, System.Text.Encoding.UTF8); writer.Formatting = Formatting.Indented; try { document.Save(writer); } finally { writer.Close(); } } catch (Exception e) { throw ServiceResultException.Create( StatusCodes.BadNotWritable, e, "Cannot update the configuration file: {0}", configuration.ConfigurationFile); } }
/// <summary> /// Exports the security configuration for an application identified by a file or url. /// </summary> /// <param name="filePath">The file path.</param> /// <returns>The security configuration.</returns> public SecuredApplication ReadConfiguration(string filePath) { if (filePath == null) throw new ArgumentNullException("filePath"); string configFilePath = filePath; string exeFilePath = null; // check for valid file. if (!File.Exists(filePath)) { throw ServiceResultException.Create( StatusCodes.BadNotReadable, "Cannot find the executable or configuration file: {0}", filePath); } // find the configuration file for the executable. if (filePath.EndsWith(".exe", StringComparison.OrdinalIgnoreCase)) { exeFilePath = filePath; try { FileInfo file = new FileInfo(filePath); string sectionName = file.Name; sectionName = sectionName.Substring(0, sectionName.Length - file.Extension.Length); System.Configuration.Configuration configuration = ConfigurationManager.OpenExeConfiguration(filePath); configFilePath = ApplicationConfiguration.GetFilePathFromAppConfig(sectionName); if (configFilePath == null) { configFilePath = filePath + ".config"; } } catch (Exception e) { throw ServiceResultException.Create( StatusCodes.BadNotReadable, e, "Cannot find the configuration file for the executable: {0}", filePath); } if (!File.Exists(configFilePath)) { throw ServiceResultException.Create( StatusCodes.BadNotReadable, "Cannot find the configuration file: {0}", configFilePath); } } SecuredApplication application = null; ApplicationConfiguration applicationConfiguration = null; try { XmlTextReader reader = new XmlTextReader(File.Open(configFilePath, FileMode.Open, FileAccess.Read)); try { reader.MoveToContent(); // find the SecuredApplication element in the file. if (reader.ReadToDescendant("SecuredApplication", Namespaces.OpcUaSecurity)) { DataContractSerializer serializer = new DataContractSerializer(typeof(SecuredApplication)); application = serializer.ReadObject(reader, false) as SecuredApplication; application.ConfigurationFile = configFilePath; application.ExecutableFile = exeFilePath; } // load the application configuration. else { reader.Close(); reader = new XmlTextReader(File.Open(configFilePath, FileMode.Open, FileAccess.Read)); DataContractSerializer serializer = new DataContractSerializer(typeof(ApplicationConfiguration)); applicationConfiguration = serializer.ReadObject(reader, false) as ApplicationConfiguration; } } finally { reader.Close(); } } catch (Exception e) { throw ServiceResultException.Create( StatusCodes.BadNotReadable, e, "Cannot load the configuration file: {0}", filePath); } // check if security info store on disk. if (application != null) { return application; } application = new SecuredApplication(); // copy application info. application.ApplicationName = applicationConfiguration.ApplicationName; application.ApplicationUri = applicationConfiguration.ApplicationUri; application.ProductName = applicationConfiguration.ProductUri; application.ApplicationType = (ApplicationType)(int)applicationConfiguration.ApplicationType; application.ConfigurationFile = configFilePath; application.ExecutableFile = exeFilePath; application.ConfigurationMode = "http://opcfoundation.org/UASDK/ConfigurationTool"; application.LastExportTime = DateTime.UtcNow; // copy the security settings. if (applicationConfiguration.SecurityConfiguration != null) { application.ApplicationCertificate = SecuredApplication.ToCertificateIdentifier(applicationConfiguration.SecurityConfiguration.ApplicationCertificate); if (applicationConfiguration.SecurityConfiguration.TrustedIssuerCertificates != null) { application.IssuerCertificateStore = SecuredApplication.ToCertificateStoreIdentifier(applicationConfiguration.SecurityConfiguration.TrustedIssuerCertificates); if (applicationConfiguration.SecurityConfiguration.TrustedIssuerCertificates.TrustedCertificates != null) { application.IssuerCertificates = SecuredApplication.ToCertificateList(applicationConfiguration.SecurityConfiguration.TrustedIssuerCertificates.TrustedCertificates); } } if (applicationConfiguration.SecurityConfiguration.TrustedPeerCertificates != null) { application.TrustedCertificateStore = SecuredApplication.ToCertificateStoreIdentifier(applicationConfiguration.SecurityConfiguration.TrustedPeerCertificates); if (applicationConfiguration.SecurityConfiguration.TrustedPeerCertificates.TrustedCertificates != null) { application.TrustedCertificates = SecuredApplication.ToCertificateList(applicationConfiguration.SecurityConfiguration.TrustedPeerCertificates.TrustedCertificates); } } if (applicationConfiguration.SecurityConfiguration.RejectedCertificateStore != null) { application.RejectedCertificatesStore = SecuredApplication.ToCertificateStoreIdentifier(applicationConfiguration.SecurityConfiguration.RejectedCertificateStore); } } ServerBaseConfiguration serverConfiguration = null; if (applicationConfiguration.ServerConfiguration != null) { serverConfiguration = applicationConfiguration.ServerConfiguration; } else if (applicationConfiguration.DiscoveryServerConfiguration != null) { serverConfiguration = applicationConfiguration.DiscoveryServerConfiguration; } if (serverConfiguration != null) { application.BaseAddresses = SecuredApplication.ToListOfBaseAddresses(serverConfiguration); application.SecurityProfiles = SecuredApplication.ToListOfSecurityProfiles(serverConfiguration.SecurityPolicies); } // return exported setttings. return application; }
/// <summary> /// Updates the XML document with the new configuration information. /// </summary> private static void UpdateDocument(XmlElement element, SecuredApplication application) { for (XmlNode node = element.FirstChild; node != null; node = node.NextSibling) { if (node.Name == "ApplicationName" && node.NamespaceURI == Namespaces.OpcUaConfig) { node.InnerText = application.ApplicationName; continue; } if (node.Name == "ApplicationUri" && node.NamespaceURI == Namespaces.OpcUaConfig) { node.InnerText = application.ApplicationUri; continue; } if (node.Name == "SecurityConfiguration" && node.NamespaceURI == Namespaces.OpcUaConfig) { SecurityConfiguration security = (SecurityConfiguration)GetObject(typeof(SecurityConfiguration), node); if (application.ApplicationCertificate != null) { security.ApplicationCertificate = SecuredApplication.FromCertificateIdentifier(application.ApplicationCertificate); } security.TrustedIssuerCertificates = SecuredApplication.FromCertificateStoreIdentifierToTrustList(application.IssuerCertificateStore); security.TrustedIssuerCertificates.TrustedCertificates = SecuredApplication.FromCertificateList(application.IssuerCertificates); security.TrustedPeerCertificates = SecuredApplication.FromCertificateStoreIdentifierToTrustList(application.TrustedCertificateStore); security.TrustedPeerCertificates.TrustedCertificates = SecuredApplication.FromCertificateList(application.TrustedCertificates); security.RejectedCertificateStore = SecuredApplication.FromCertificateStoreIdentifier(application.RejectedCertificatesStore); node.InnerXml = SetObject(typeof(SecurityConfiguration), security); continue; } if (node.Name == "ServerConfiguration" && node.NamespaceURI == Namespaces.OpcUaConfig) { ServerConfiguration configuration = (ServerConfiguration)GetObject(typeof(ServerConfiguration), node); SecuredApplication.FromListOfBaseAddresses(configuration, application.BaseAddresses); configuration.SecurityPolicies = SecuredApplication.FromListOfSecurityProfiles(application.SecurityProfiles); node.InnerXml = SetObject(typeof(ServerConfiguration), configuration); continue; } else if (node.Name == "DiscoveryServerConfiguration" && node.NamespaceURI == Namespaces.OpcUaConfig) { DiscoveryServerConfiguration configuration = (DiscoveryServerConfiguration)GetObject(typeof(DiscoveryServerConfiguration), node); SecuredApplication.FromListOfBaseAddresses(configuration, application.BaseAddresses); configuration.SecurityPolicies = SecuredApplication.FromListOfSecurityProfiles(application.SecurityProfiles); node.InnerXml = SetObject(typeof(DiscoveryServerConfiguration), configuration); continue; } } }
/// <summary> /// Updates the security configuration for an application identified by a file or url. /// </summary> /// <param name="filePath">The file path.</param> /// <param name="configuration">The configuration.</param> public void WriteConfiguration(string filePath, SecuredApplication configuration) { if (configuration == null) throw new ArgumentNullException("configuration"); // check for valid file. if (String.IsNullOrEmpty(filePath) || !File.Exists(filePath)) { throw ServiceResultException.Create( StatusCodes.BadNotReadable, "Cannot find the configuration file: {0}", configuration.ConfigurationFile); } // load from file. XmlDocument document = new XmlDocument(); document.Load(filePath); XmlElement element = Find(document.DocumentElement, "SecuredApplication", Namespaces.OpcUaSecurity); // update secured application. if (element != null) { configuration.LastExportTime = DateTime.UtcNow; element.InnerXml = SetObject(typeof(SecuredApplication), configuration); } // update application configuration. else { UpdateDocument(document.DocumentElement, configuration); } try { // update configuration file. Stream ostrm = File.Open(filePath, FileMode.Create, FileAccess.Write); XmlTextWriter writer = new XmlTextWriter(ostrm, System.Text.Encoding.UTF8); writer.Formatting = Formatting.Indented; try { document.Save(writer); } finally { writer.Close(); } } catch (Exception e) { throw ServiceResultException.Create( StatusCodes.BadNotWritable, e, "Cannot update the configuration file: {0}", configuration.ConfigurationFile); } }
/// <summary> /// Exports the security configuration for an application identified by a file or url. /// </summary> /// <param name="filePath">The file path.</param> /// <returns>The security configuration.</returns> public SecuredApplication ReadConfiguration(string filePath) { if (filePath == null) { throw new ArgumentNullException(nameof(filePath)); } string configFilePath = filePath; string exeFilePath = null; // check for valid file. if (!File.Exists(filePath)) { throw ServiceResultException.Create( StatusCodes.BadNotReadable, "Cannot find the executable or configuration file: {0}", filePath); } // find the configuration file for the executable. if (filePath.EndsWith(".exe", StringComparison.OrdinalIgnoreCase)) { exeFilePath = filePath; try { FileInfo file = new FileInfo(filePath); string sectionName = file.Name; sectionName = sectionName.Substring(0, sectionName.Length - file.Extension.Length); configFilePath = ApplicationConfiguration.GetFilePathFromAppConfig(sectionName); if (configFilePath == null) { configFilePath = filePath + ".config"; } } catch (Exception e) { throw ServiceResultException.Create( StatusCodes.BadNotReadable, e, "Cannot find the configuration file for the executable: {0}", filePath); } if (!File.Exists(configFilePath)) { throw ServiceResultException.Create( StatusCodes.BadNotReadable, "Cannot find the configuration file: {0}", configFilePath); } } SecuredApplication application = null; ApplicationConfiguration applicationConfiguration = null; try { FileStream reader = File.Open(configFilePath, FileMode.Open, FileAccess.Read, FileShare.Read); try { byte[] data = new byte[reader.Length]; reader.Read(data, 0, (int)reader.Length); // find the SecuredApplication element in the file. if (data.ToString().Contains("SecuredApplication")) { DataContractSerializer serializer = new DataContractSerializer(typeof(SecuredApplication)); application = serializer.ReadObject(reader) as SecuredApplication; application.ConfigurationFile = configFilePath; application.ExecutableFile = exeFilePath; } // load the application configuration. else { reader.Dispose(); reader = File.Open(configFilePath, FileMode.Open, FileAccess.Read, FileShare.Read); DataContractSerializer serializer = new DataContractSerializer(typeof(ApplicationConfiguration)); applicationConfiguration = serializer.ReadObject(reader) as ApplicationConfiguration; } } finally { reader.Dispose(); } } catch (Exception e) { throw ServiceResultException.Create( StatusCodes.BadNotReadable, e, "Cannot load the configuration file: {0}", filePath); } // check if security info store on disk. if (application != null) { return(application); } application = new SecuredApplication(); // copy application info. application.ApplicationName = applicationConfiguration.ApplicationName; application.ApplicationUri = applicationConfiguration.ApplicationUri; application.ProductName = applicationConfiguration.ProductUri; application.ApplicationType = (ApplicationType)(int)applicationConfiguration.ApplicationType; application.ConfigurationFile = configFilePath; application.ExecutableFile = exeFilePath; application.ConfigurationMode = "http://opcfoundation.org/UASDK/ConfigurationTool"; application.LastExportTime = DateTime.UtcNow; // copy the security settings. if (applicationConfiguration.SecurityConfiguration != null) { application.ApplicationCertificate = SecuredApplication.ToCertificateIdentifier(applicationConfiguration.SecurityConfiguration.ApplicationCertificate); if (applicationConfiguration.SecurityConfiguration.TrustedIssuerCertificates != null) { application.IssuerCertificateStore = SecuredApplication.ToCertificateStoreIdentifier(applicationConfiguration.SecurityConfiguration.TrustedIssuerCertificates); if (applicationConfiguration.SecurityConfiguration.TrustedIssuerCertificates.TrustedCertificates != null) { application.IssuerCertificates = SecuredApplication.ToCertificateList(applicationConfiguration.SecurityConfiguration.TrustedIssuerCertificates.TrustedCertificates); } } if (applicationConfiguration.SecurityConfiguration.TrustedPeerCertificates != null) { application.TrustedCertificateStore = SecuredApplication.ToCertificateStoreIdentifier(applicationConfiguration.SecurityConfiguration.TrustedPeerCertificates); if (applicationConfiguration.SecurityConfiguration.TrustedPeerCertificates.TrustedCertificates != null) { application.TrustedCertificates = SecuredApplication.ToCertificateList(applicationConfiguration.SecurityConfiguration.TrustedPeerCertificates.TrustedCertificates); } } if (applicationConfiguration.SecurityConfiguration.RejectedCertificateStore != null) { application.RejectedCertificatesStore = SecuredApplication.ToCertificateStoreIdentifier(applicationConfiguration.SecurityConfiguration.RejectedCertificateStore); } } ServerBaseConfiguration serverConfiguration = null; if (applicationConfiguration.ServerConfiguration != null) { serverConfiguration = applicationConfiguration.ServerConfiguration; } else if (applicationConfiguration.DiscoveryServerConfiguration != null) { serverConfiguration = applicationConfiguration.DiscoveryServerConfiguration; } if (serverConfiguration != null) { application.BaseAddresses = SecuredApplication.ToListOfBaseAddresses(serverConfiguration); application.SecurityProfiles = SecuredApplication.ToListOfSecurityProfiles(serverConfiguration.SecurityPolicies); } // return exported setttings. return(application); }
/// <summary> /// Opens the certificate store. /// </summary> public ICertificateStore OpenStore() { Opc.Ua.CertificateStoreIdentifier output = SecuredApplication.FromCertificateStoreIdentifier(this); return(output.OpenStore()); }
/// <summary> /// Gets the certificate associated with the identifier. /// </summary> public async Task <X509Certificate2> Find(bool needPrivateKey) { Opc.Ua.CertificateIdentifier output = SecuredApplication.FromCertificateIdentifier(this); return(await output.Find(needPrivateKey)); }
/// <summary> /// Gets the certificate associated with the identifier. /// </summary> public async Task <X509Certificate2> Find() { Opc.Ua.CertificateIdentifier output = SecuredApplication.FromCertificateIdentifier(this); return(await output.Find(false)); }
/// <summary> /// Gets the private key file path. /// </summary> public string GetPrivateKeyFilePath() { Opc.Ua.CertificateIdentifier output = SecuredApplication.FromCertificateIdentifier(this); return(output.GetPrivateKeyFilePath()); }
/// <summary> /// Gets the certificate associated with the identifier. /// </summary> public System.Security.Cryptography.X509Certificates.X509Certificate2 Find(bool needPrivateKey) { Opc.Ua.CertificateIdentifier output = SecuredApplication.FromCertificateIdentifier(this); return(output.Find(needPrivateKey)); }
/// <summary> /// Gets the certificate associated with the identifier. /// </summary> public System.Security.Cryptography.X509Certificates.X509Certificate2 Find() { Opc.Ua.CertificateIdentifier output = SecuredApplication.FromCertificateIdentifier(this); return(output.Find(false)); }
/// <summary> /// Gets the private key file path. /// </summary> public async Task <string> GetPrivateKeyFilePath() { Opc.Ua.CertificateIdentifier output = SecuredApplication.FromCertificateIdentifier(this); return(await output.GetPrivateKeyFilePath()); }