From af41c7979899ba822563361cd3a8040f86660d41 Mon Sep 17 00:00:00 2001 From: Emile Vauge Date: Thu, 31 Mar 2016 13:43:48 +0200 Subject: [PATCH] Fix acme renew panic Signed-off-by: Emile Vauge --- acme/acme.go | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/acme/acme.go b/acme/acme.go index c3498d074..9b41778e4 100644 --- a/acme/acme.go +++ b/acme/acme.go @@ -142,6 +142,22 @@ type DomainsCertificate struct { tlsCert *tls.Certificate } +func (dc *DomainsCertificate) needRenew() bool { + for _, c := range dc.tlsCert.Certificate { + crt, err := x509.ParseCertificate(c) + if err != nil { + // If there's an error, we assume the cert is broken, and needs update + return true + } + // <= 7 days left, renew certificate + if crt.NotAfter.Before(time.Now().Add(time.Duration(24 * 7 * time.Hour))) { + return true + } + } + + return false +} + // ACME allows to connect to lets encrypt and retrieve certs type ACME struct { Email string @@ -289,8 +305,7 @@ func (a *ACME) retrieveCertificates(client *acme.Client, account *Account) { func (a *ACME) renewCertificates(client *acme.Client, account *Account) error { for _, certificateResource := range account.DomainsCertificate.Certs { - // <= 7 days left, renew certificate - if certificateResource.tlsCert.Leaf.NotAfter.Before(time.Now().Add(time.Duration(24 * 7 * time.Hour))) { + if certificateResource.needRenew() { log.Debugf("Renewing certificate %+v", certificateResource.Domains) renewedCert, err := client.RenewCertificate(acme.CertificateResource{ Domain: certificateResource.Certificate.Domain,