private void UpdateApplicationCertificate(Opc.Ua.Security.SecuredApplication application, CertificateStoreIdentifier store, X509Certificate2 certificate)
{
if (!certificate.HasPrivateKey)
{
MessageBox.Show("Cannot use a certificate without an accessible private key.", "Import Certificate", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
// check if the old certificate should be deleted.
Opc.Ua.Security.CertificateIdentifier oldId = application.ApplicationCertificate;
if (oldId != null)
{
X509Certificate2 oldCertificate = oldId.Find();
if (oldCertificate != null && oldCertificate.Thumbprint != certificate.Thumbprint)
{
if (new YesNoDlg().ShowDialog("Would you like to delete the old certificate?", "Delete Certificate") == DialogResult.Yes)
{
DeleteApplicationCertificate(application, oldCertificate);
}
}
}
// set the application name.
List<string> subjectName = Utils.ParseDistinguishedName(certificate.Subject);
foreach (string subjectField in subjectName)
{
if (subjectField.StartsWith("CN="))
{
application.ApplicationName = subjectField.Substring(3);
break;
}
}
// set the application uri.
string applicationUri = Utils.GetApplicationUriFromCertficate(certificate);
if (applicationUri != null)
{
application.ApplicationUri = applicationUri;
}
// update the certificate.
application.ApplicationCertificate = new Opc.Ua.Security.CertificateIdentifier();
application.ApplicationCertificate.StorePath = store.StorePath;
application.ApplicationCertificate.StoreType = store.StoreType;
application.ApplicationCertificate.SubjectName = certificate.Subject;
application.ApplicationCertificate.Thumbprint = certificate.Thumbprint;
// save the configuration.
new Opc.Ua.Security.SecurityConfigurationManager().WriteConfiguration(application.ConfigurationFile, application);
}