Ejemplo n.º 1
0
        private async void GenerateCertificatesAsync()
        {
            try
            {
                if (!this.ValidateControls())
                {
                    UpdateStatusStrip("Please fill all required fields.");
                    return;
                }

                var savePath = this.textBoxSavePath.Text;

                if (!Directory.Exists(savePath))
                {
                    throw new Exception("Destination directory does not exist.");
                }

                if (Directory.GetFiles(savePath).Length > 0)
                {
                    throw new Exception("Destination directory must be empty.");
                }

                UpdateStatusStrip("Generating Certificate files...");

                ToogleControls(enabled: false);

                var now              = DateTime.UtcNow;
                var keySize          = Convert.ToUInt32(this.comboBoxKeySize.SelectedItem);
                var validityInMonths = Convert.ToInt32(this.comboBoxValidity.SelectedItem);
                var serialNumber     = Convert.ToInt64(this.numericUpDownSerialNumber.Value);

                await Task.Run(() =>
                {
                    var certificateBuilderResult = new CACertificateBuilder()
                                                   .WithSerialNumberConfiguration(this.checkBoxRandomSerialNumber.Checked, serialNumber - 1)
                                                   .SetKeySize(keySize)
                                                   .SetSubjectDN(this.textBoxCN.Text + " CA", this.textBoxOU.Text, this.textBoxO.Text, null, this.textBoxC.Text)
                                                   .SetNotBefore(now)
                                                   .SetNotAfter(now.AddMonths(validityInMonths))
                                                   .Build();

                    var pkcs12Data = certificateBuilderResult.ExportCertificate(this.textBoxPassword.Text.ToSecureString());

                    var sslCertificateBuilder = new SSLCertificateBuilder()
                                                .WithSerialNumberConfiguration(this.checkBoxRandomSerialNumber.Checked, serialNumber)
                                                .SetKeySize(keySize)
                                                .SetSubjectDN(this.textBoxCN.Text, this.textBoxOU.Text, this.textBoxO.Text, null, this.textBoxC.Text)
                                                .SetNotBefore(now)
                                                .SetNotAfter(now.AddMonths(validityInMonths))
                                                .SetIssuerCertificate(pkcs12Data, this.textBoxPassword.Text.ToSecureString());

                    if (this.checkBoxClientAuthentication.Checked)
                    {
                        sslCertificateBuilder = sslCertificateBuilder.SetClientAuthKeyUsage();
                    }
                    ;

                    if (this.checkBoxServerAuthentication.Checked)
                    {
                        sslCertificateBuilder = sslCertificateBuilder.SetServerAuthKeyUsage();
                    }
                    ;

                    if (!this.textBoxSAN.Text.IsNullOrEmpty())
                    {
                        var sans = this.textBoxSAN.Text.Split(';').Select(x => x.Trim()).ToList();
                        sslCertificateBuilder = sslCertificateBuilder.SetSubjectAlternativeNames(sans);
                    }
                    ;

                    var sslCertificateBuilderResult = sslCertificateBuilder.Build();
                    File.WriteAllBytes(Path.Combine(savePath, "caCertificate.p12"), pkcs12Data);

                    if (this.checkBoxCertificateExportCrt.Checked)
                    {
                        var certData = certificateBuilderResult.Certificate.ExportPublicKeyCertificate();
                        File.WriteAllBytes(Path.Combine(savePath, "caCertificate.crt"), certData);
                    }

                    var sslPkcs12Data = sslCertificateBuilderResult.ExportCertificate(this.textBoxPassword.Text.ToSecureString());
                    File.WriteAllBytes(Path.Combine(savePath, "sslCertificate.p12"), sslPkcs12Data);

                    if (this.checkBoxCertificateExportCrt.Checked)
                    {
                        var sslCertData = sslCertificateBuilderResult.Certificate.ExportPublicKeyCertificate();
                        File.WriteAllBytes(Path.Combine(savePath, "sslCertificate.crt"), sslCertData);
                    }
                });

                UpdateStatusStrip("Certificates generated successfully.");
            }
            catch (Exception ex)
            {
                MessageBox.Show(this, $"Error: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

                UpdateStatusStrip(string.Empty);
            }

            ToogleControls(enabled: true);
        }