private async Task <X509Certificate2> GetOrCreateCertificate(CertificateFactory factory, CancellationToken cancellationToken) { var domainName = _options.Value.DomainNames[0]; var cert = _certificateStore.GetCertificate(domainName); if (cert != null) { _logger.LogDebug("Certificate for {hostname} already found.", domainName); return(cert); } if (!_hasRegistered) { _hasRegistered = true; await factory.RegisterUserAsync(cancellationToken); } try { _logger.LogInformation("Creating certificate for {hostname} using ACME server {acmeServer}", domainName, _options.Value.GetAcmeServer(_hostEnvironment)); cert = await factory.CreateCertificateAsync(cancellationToken); _logger.LogInformation("Created certificate {subjectName} ({thumbprint})", cert.Subject, cert.Thumbprint); _certificateStore.Save(domainName, cert); return(cert); } catch (Exception ex) { _logger.LogError(0, ex, "Failed to automatically create a certificate for {hostname}", domainName); throw; } }