Opc.Ua.Com.ProxyUtils.CheckApplicationInstanceCertificate C# (CSharp) Method

CheckApplicationInstanceCertificate() public static method

Synchronous helper implementation of CheckApplicationInstanceCertificate for C++ Proxy
public static CheckApplicationInstanceCertificate ( ApplicationConfiguration configuration ) : void
configuration ApplicationConfiguration
return void
        public static void CheckApplicationInstanceCertificate(ApplicationConfiguration configuration)
        {
            // create a default certificate id none specified.
            CertificateIdentifier id = configuration.SecurityConfiguration.ApplicationCertificate;

            if (id == null)
            {
                id = new CertificateIdentifier();
                id.StoreType = Utils.DefaultStoreType;
                id.StorePath = Utils.DefaultStorePath;
                id.SubjectName = configuration.ApplicationName;
            }

            // check for certificate with a private key.
            X509Certificate2 certificate = null;
            Task.Run(async () => certificate = await id.Find(true)).Wait();

            if (certificate != null)
            {
                return;
            }

            // construct the subject name from the 
            List<string> hostNames = new List<string>();
            hostNames.Add(Utils.GetHostName());

            string commonName = Utils.Format("CN={0}", configuration.ApplicationName);
            string domainName = Utils.Format("DC={0}", hostNames[0]);
            string subjectName = Utils.Format("{0}, {1}", commonName, domainName);

            // create a new certificate with a new public key pair.
            certificate = CertificateFactory.CreateCertificate(
                id.StoreType,
                id.StorePath,
                configuration.ApplicationUri,
                configuration.ApplicationName,
                subjectName,
                hostNames,
                2048,
                120,
                256);

            // update and save the configuration file.
            id.Certificate = certificate;
            configuration.SaveToFile(configuration.SourceFilePath);

            // add certificate to the trusted peer store so other applications will trust it.
            ICertificateStore store = configuration.SecurityConfiguration.TrustedPeerCertificates.OpenStore();

            try
            {
                Task.Run(async () =>
                    {
                        X509Certificate2Collection certificateCollection = await store.FindByThumbprint(certificate.Thumbprint);
                        if (certificateCollection != null)
                        {
                            await store.Add(certificateCollection[0]);
                        }
                    }
                ).Wait();
            }
            finally
            {
                store.Close();
            }

            // tell the certificate validator about the new certificate.
            configuration.CertificateValidator.Update(configuration.SecurityConfiguration);

        }