示例#1
0
        private void RequestNewButton_Click(object sender, EventArgs e)
        {
            try
            {
                NodeId requestId = null;

                bool newPrivateKeyRequired = false;

                if (!String.IsNullOrEmpty(m_application.CertificatePrivateKeyPath))
                {
                    string path = Utils.GetAbsoluteFilePath(m_application.CertificatePrivateKeyPath, true, false, false);
                    newPrivateKeyRequired = path == null;
                }
                else if (!String.IsNullOrEmpty(m_application.CertificateStorePath))
                {
                    CertificateIdentifier id = new CertificateIdentifier();

                    id.StoreType   = CertificateStoreIdentifier.DetermineStoreType(m_application.CertificateStorePath);
                    id.StorePath   = m_application.CertificateStorePath;
                    id.SubjectName = m_application.CertificateSubjectName.Replace("localhost", System.Net.Dns.GetHostName());

                    newPrivateKeyRequired = id.Find(true) == null;
                }
                else if (!String.IsNullOrEmpty(m_application.ServerUrl))
                {
                    newPrivateKeyRequired = true;
                }

                byte[] certificateRequest = null;

                if (m_application.RegistrationType == RegistrationType.ServerPush)
                {
                    byte[] nonce = new byte[32];
                    System.Security.Cryptography.RandomNumberGenerator.Create().GetBytes(nonce);
                    certificateRequest    = m_server.CreateCertificateRequest(null, null, null, false, nonce);
                    newPrivateKeyRequired = false;

                    if (m_server.Endpoint != null && m_server.Endpoint.Description.ServerCertificate != null)
                    {
                        m_certificate = new X509Certificate2(m_server.Endpoint.Description.ServerCertificate);
                    }
                }

                if (newPrivateKeyRequired || RequestNewPrivateKey || m_certificate == null)
                {
                    m_certificatePassword = null; // Guid.NewGuid().ToString();

                    string   privateKeyFormat = GetPrivateKeyFormat();
                    string[] domainNames      = GetDomainNames();
                    string   subjectName      = GetSubjectName(domainNames);

                    requestId = m_gds.StartNewKeyPairRequest(
                        m_application.ApplicationId,
                        null,
                        null,
                        subjectName,
                        domainNames,
                        privateKeyFormat,
                        m_certificatePassword);
                }
                else
                {
                    if (certificateRequest == null)
                    {
                        var    certificate = m_certificate;
                        byte[] privateKey  = null;
                        bool   isPemKey    = false;

                        if (!certificate.HasPrivateKey)
                        {
                            if (!String.IsNullOrEmpty(m_application.CertificatePrivateKeyPath))
                            {
                                string path = Utils.GetAbsoluteFilePath(m_application.CertificatePrivateKeyPath, true, false, false);

                                if (path != null)
                                {
                                    privateKey = File.ReadAllBytes(path);
                                    isPemKey   = path.EndsWith("PEM", StringComparison.OrdinalIgnoreCase);
                                }
                            }
                        }

                        certificateRequest = CertificateAuthority.CreateRequest(
                            certificate,
                            privateKey,
                            isPemKey,
                            null,
                            null,
                            null,
                            null,
                            256);
                    }

                    requestId = m_gds.StartSigningRequest(m_application.ApplicationId, null, null, certificateRequest);
                }

                m_application.CertificateRequestId = requestId.ToString();
                CertificateRequestTimer.Enabled    = true;
                RequestProgressLabel.Visible       = true;
                WarningLabel.Visible = false;
            }
            catch (Exception exception)
            {
                MessageBox.Show(Parent.Text + ": " + exception.Message);
            }
        }