@@ -66,6 +66,7 @@ func NewACMEService(
|
||||
) (*ACMEService, error) {
|
||||
if accountKey == nil {
|
||||
var err error
|
||||
|
||||
accountKey, err = keys.Generate(keyType)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("cannot generate account key: %w", err)
|
||||
@@ -130,6 +131,7 @@ func (s *ACMEService) GetHTTPChallenge(ctx context.Context, domain string) (*HTT
|
||||
}
|
||||
|
||||
var challenge *acme.Challenge
|
||||
|
||||
for _, auth := range order.AuthzURLs {
|
||||
authz, err := s.client.GetAuthorization(ctx, auth)
|
||||
if err != nil {
|
||||
@@ -170,7 +172,6 @@ func (s *ACMEService) CompleteHTTPChallenge(
|
||||
ctx context.Context,
|
||||
challenge0 *HTTPChallenge,
|
||||
) (*Certificate, error) {
|
||||
|
||||
challenge1 := &acme.Challenge{
|
||||
URI: challenge0.URL,
|
||||
Token: challenge0.Token,
|
||||
@@ -206,6 +207,7 @@ func (s *ACMEService) CompleteHTTPChallenge(
|
||||
}
|
||||
|
||||
certPEM := pem.EncodeCertificate(der[0])
|
||||
|
||||
keyPEM, err := pem.EncodePrivateKey(certKey)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("cannot encode key: %w", err)
|
||||
@@ -215,6 +217,7 @@ func (s *ACMEService) CompleteHTTPChallenge(
|
||||
if len(der) > 1 {
|
||||
chainDER = der[1:]
|
||||
}
|
||||
|
||||
chainPEM := pem.EncodeCertificateChain(chainDER)
|
||||
|
||||
return &Certificate{
|
||||
|
||||
@@ -62,6 +62,7 @@ func (h *ACMEChallengeHandler) Handle(next http.Handler) http.Handler {
|
||||
)
|
||||
|
||||
http.NotFound(w, r)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@ func NewCacheStore(
|
||||
|
||||
func (w *CacheStore) WarmCache(ctx context.Context) error {
|
||||
w.logger.InfoCtx(ctx, "warming certificate cache")
|
||||
|
||||
startTime := time.Now()
|
||||
|
||||
err := w.pg.WithConn(
|
||||
@@ -65,6 +66,7 @@ func (w *CacheStore) WarmCache(ctx context.Context) error {
|
||||
w.logger.InfoCtx(ctx, "found active certificates to cache", log.Int("count", len(domains)))
|
||||
|
||||
successCount := 0
|
||||
|
||||
for _, domain := range domains {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
@@ -80,10 +82,10 @@ func (w *CacheStore) WarmCache(ctx context.Context) error {
|
||||
}
|
||||
|
||||
w.logger.InfoCtx(ctx, "successfully warmed cache", log.Int("success_count", successCount), log.Int("total_count", len(domains)))
|
||||
|
||||
return nil
|
||||
},
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot warm certificate cache: %w", err)
|
||||
}
|
||||
|
||||
@@ -160,6 +160,7 @@ func (p *Provisioner) checkCAARecords(domain string) error {
|
||||
}
|
||||
|
||||
var caaRecords []*dns.CAA
|
||||
|
||||
for _, rr := range resp.Answer {
|
||||
if caa, ok := rr.(*dns.CAA); ok {
|
||||
caaRecords = append(caaRecords, caa)
|
||||
@@ -235,7 +236,6 @@ func (p *Provisioner) checkPendingDomains(ctx context.Context) error {
|
||||
return nil
|
||||
},
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot provision domains: %w", err)
|
||||
}
|
||||
@@ -343,6 +343,7 @@ func (p *Provisioner) provisionDomainCertificate(
|
||||
)
|
||||
|
||||
errMsg := err.Error()
|
||||
|
||||
domain.ProvisioningError = &errMsg
|
||||
if err := domain.Update(ctx, tx, coredata.NewNoScope()); err != nil {
|
||||
return fmt.Errorf("cannot update domain with provisioning error: %w", err)
|
||||
@@ -360,6 +361,7 @@ func (p *Provisioner) provisionDomainCertificate(
|
||||
)
|
||||
|
||||
errMsg := err.Error()
|
||||
|
||||
domain.ProvisioningError = &errMsg
|
||||
if err := domain.Update(ctx, tx, coredata.NewNoScope()); err != nil {
|
||||
return fmt.Errorf("cannot update domain with provisioning error: %w", err)
|
||||
@@ -383,6 +385,7 @@ func (p *Provisioner) provisionDomainCertificate(
|
||||
log.String("domain", domain.Domain),
|
||||
log.Error(err),
|
||||
)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -466,10 +469,12 @@ func (p *Provisioner) provisionDomainCertificate(
|
||||
)
|
||||
|
||||
domain.ProvisioningError = nil
|
||||
|
||||
domain.SSLCertificatePEM = cert.CertPEM
|
||||
if err := domain.EncryptPrivateKey(cert.KeyPEM, p.encryptionKey); err != nil {
|
||||
return fmt.Errorf("cannot encrypt private key: %w", err)
|
||||
}
|
||||
|
||||
chainStr := string(cert.ChainPEM)
|
||||
domain.SSLCertificateChain = &chainStr
|
||||
domain.SSLExpiresAt = &cert.ExpiresAt
|
||||
|
||||
@@ -78,6 +78,7 @@ func (r *Renewer) checkAndRenew(ctx context.Context) error {
|
||||
ctx,
|
||||
func(ctx context.Context, tx pg.Tx) error {
|
||||
var caches coredata.CachedCertificates
|
||||
|
||||
cacheCount, err := caches.CountAll(ctx, tx)
|
||||
if err != nil {
|
||||
r.logger.ErrorCtx(ctx, "cannot count certificate cache", log.Error(err))
|
||||
@@ -97,6 +98,7 @@ func (r *Renewer) checkAndRenew(ctx context.Context) error {
|
||||
}
|
||||
|
||||
domains := coredata.CustomDomains{}
|
||||
|
||||
scope := coredata.NewNoScope()
|
||||
if err := domains.ListDomainsForRenewal(ctx, tx, scope); err != nil {
|
||||
return fmt.Errorf("cannot list domains for renewal: %w", err)
|
||||
@@ -116,6 +118,7 @@ func (r *Renewer) checkAndRenew(ctx context.Context) error {
|
||||
}
|
||||
|
||||
r.logger.InfoCtx(ctx, "renewing certificate for domain", log.String("domain", domain.Domain))
|
||||
|
||||
if err := r.renewDomain(ctx, tx, domain.ID); err != nil {
|
||||
r.logger.ErrorCtx(ctx, "cannot renew certificate", log.String("domain", domain.Domain), log.Error(err))
|
||||
} else {
|
||||
|
||||
@@ -71,6 +71,7 @@ func (s *Selector) GetCertificate(hello *tls.ClientHelloInfo) (*tls.Certificate,
|
||||
}
|
||||
|
||||
s.cache.Store(domain, cert)
|
||||
|
||||
return cert, nil
|
||||
}
|
||||
|
||||
@@ -78,6 +79,7 @@ func (s *Selector) loadFromDatabase(domain string) (*tls.Certificate, error) {
|
||||
ctx := context.Background()
|
||||
|
||||
var cert *tls.Certificate
|
||||
|
||||
err := s.pg.WithConn(
|
||||
ctx,
|
||||
func(ctx context.Context, conn pg.Querier) error {
|
||||
@@ -103,10 +105,10 @@ func (s *Selector) loadFromDatabase(domain string) (*tls.Certificate, error) {
|
||||
}
|
||||
|
||||
cert = &tlsCert
|
||||
|
||||
return nil
|
||||
},
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user