private List <string> BUildNameList(CertificateSignRequestCreateViewModel model)
        {
            List <string> x509NameList = new List <string>();

            if (!string.IsNullOrWhiteSpace(model.Country))
            {
                x509NameList.Add($"C={model.Country}");
            }
            if (!string.IsNullOrWhiteSpace(model.State))
            {
                x509NameList.Add($"ST={model.State}");
            }
            if (!string.IsNullOrWhiteSpace(model.City))
            {
                x509NameList.Add($"L={model.City}");
            }
            if (!string.IsNullOrWhiteSpace(model.Company))
            {
                x509NameList.Add($"O={model.Company}");
            }
            if (!string.IsNullOrWhiteSpace(model.Department))
            {
                x509NameList.Add($"OU={model.Department}");
            }
            if (!string.IsNullOrWhiteSpace(model.CommonName))
            {
                x509NameList.Add($"CN={model.CommonName}");
            }
            return(x509NameList);
        }
        public IActionResult Create(Guid?keyPairSysid = null)
        {
            if (keyPairSysid.HasValue)
            {
                ViewBag.KeyPairSysId = keyPairSysid.Value;
            }
            var model = new CertificateSignRequestCreateViewModel();

            return(View(model));
        }
        public async Task <IActionResult> Create([FromServices] IDeviceCertificateService deviceCertificateService,
                                                 [FromServices] IRsaKeyPairService rsaKeyPairService,
                                                 [FromServices] KeyPairAppService keyPairAppService,
                                                 [Bind] CertificateSignRequestCreateViewModel model,
                                                 [Bind] Guid?keyPairSysid = null)
        {
            if (ModelState.IsValid)
            {
                var x509NameList = BUildNameList(model);

                if (!x509NameList.Any())
                {
                    throw new Exception("X509 Name can't be empty");
                }

                AsymmetricCipherKeyPair keyPair = null;
                if (keyPairSysid.HasValue)
                {
                    var keyPairEntity = tenantContext.KeyPairs.SingleOrDefault(x => x.Sysid == keyPairSysid.Value);
                    keyPair = CertificateUtil.ReadPrivateKey(keyPairEntity.PrivateKey.ConvertBase64ToUTF8());
                }
                else
                {
                    var keyPairEntity = keyPairAppService.GenerateKeyPair(out keyPair, model.CommonName);
                    keyPairSysid = keyPairEntity.Sysid;
                    await keyPairAppService.InsertAsync(keyPairEntity);
                }

                var x509Name = string.Join(", ", x509NameList);
                var sans     = new List <string> {
                    model.CommonName
                };
                var csr = deviceCertificateService.CreateCertificateSignRequest(keyPair.Public, x509Name, sans, keyPair.Private);

                var verifyResult = csr.Verify(keyPair.Public);

                var publicKey = csr.GetPublicKey();

                tenantContext.DeviceCertificates.Add(new DeviceCertificate
                {
                    Name         = model.CommonName,
                    SignRequest  = CertificateUtil.ExportToByte(csr).ConvertToBase64String(),
                    AccountSysid = this.UserSession.UserSysId,
                    KeyPairSysid = keyPairSysid.Value
                });
                await tenantContext.SaveChangesAsync();

                return(RedirectToAction(nameof(Index)));
            }

            return(View(model));
        }