public async Task <IActionResult> Sign(
            [FromServices] ICertificateAuthorityService certificateAuthorityService,
            [FromServices] RootAuthorityAppService rootAuthorityAppService,
            [FromServices] SystemContext adminDbContext,
            Guid certSysid)
        {
            var deviceCertificate = tenantContext.DeviceCertificates.SingleOrDefault(x => x.Sysid == certSysid);

            //var CommonName = "AgileLabs Root Certificate Authority";

            CertificateAuthority signCa = rootAuthorityAppService.GetDefaultRootCertificate();//agileLabsDbContext.CertificateAuthorities.FirstOrDefault(x => x.CommonName == CommonName);

            var rootCertificate = CertificateUtil.CreateX509Certificate2(Convert.FromBase64String(signCa.Certificate));

            var signCaKeyPair    = adminDbContext.KeyPairs.FirstOrDefault(x => x.Sysid == signCa.KeyPairSysid);
            var rootcaPrivateKey = CertificateUtil.ReadPrivateKey(signCaKeyPair.PrivateKey.ConvertBase64ToUTF8());

            var csr = CertificateUtil.PemRead <Pkcs10CertificationRequest>(deviceCertificate.SignRequest.ConvertBase64ToUTF8());

            var csrPublicKey = csr.GetPublicKey();

            var issuerNameList = rootCertificate.IssuerName.Name.Replace("S=", "ST=").Split(", ");
            var x509Name       = new X509Name(string.Join(", ", issuerNameList.Reverse().ToList()));
            var certificate    = certificateAuthorityService.SignCertificate(csr, x509Name, rootcaPrivateKey.Private);

            deviceCertificate.Certificate = CertificateUtil.ExportToByte(certificate, X509ContentType.Cert).ConvertToBase64String();
            tenantContext.Update(deviceCertificate);
            await tenantContext.SaveChangesAsync();

            return(RedirectToAction(nameof(Index)));
        }
        public IActionResult DownloadRootCertificate([FromServices] RootAuthorityAppService rootAuthorityAppService)
        {
            string formatedCertString = rootAuthorityAppService.GetRootCertificate();

            Response.Headers.Add("Content-Disposition", $"attachment;filename=agilelabs_root_ca.pem");
            return(File(Encoding.UTF8.GetBytes(formatedCertString), "application/x-x509-ca-cert"));
        }
        public async Task <IActionResult> DownnloadCertificatePemFormat(Guid certSysid,
                                                                        [FromServices] SystemContext adminDbContext,
                                                                        [FromServices] RootAuthorityAppService rootAuthorityAppService,
                                                                        [FromServices] DeviceCertificateAppService deviceCertificateAppService)
        {
            var deviceCertString     = deviceCertificateAppService.GetDeviceCertificate(certSysid);
            var deviceRootCertString = rootAuthorityAppService.GetRootCertificate();

            var pemFormatCertContent = $"{deviceCertString}{Environment.NewLine}{deviceRootCertString}";

            Response.Headers.Add("Content-Disposition", $"attachment;filename={certSysid}.pem");
            //content type get from: https://www.thoughtco.com/mime-types-by-content-type-3469108
            await Task.CompletedTask;

            return(File(Encoding.UTF8.GetBytes(pemFormatCertContent), "application/x-pem-file"));
        }
        public async Task <IActionResult> CreateRootCa(
            [Bind] RootCaCreateViewModel model,
            [FromServices] RootAuthorityAppService rootAuthorityAppService,
            [FromServices] TenantContext agileLabsDbContext)
        {
            if (ModelState.IsValid)
            {
                await rootAuthorityAppService.CreateRootCertificationAuthority(model.KeyPairSysid, model.Name);

                await _adminDbContext.SaveChangesAsync();

                await agileLabsDbContext.SaveChangesAsync();

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