Skip to content

Commit d246e4e

Browse files
authored
Merge pull request #5 from vinted/feature/reissue_certificate_if_domains_changes
Reissue certificate if domains change
2 parents c04a33e + ae22903 commit d246e4e

File tree

3 files changed

+82
-24
lines changed

3 files changed

+82
-24
lines changed

cmd/certificator/main.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,14 @@ func main() {
6565
}
6666
logger.Infof("checking certificate for %s", mainDomain)
6767

68-
needsRenewing, err := certificate.NeedsRenewing(cert, mainDomain, cfg.RenewBeforeDays, logger)
68+
needsReissuing, err := certificate.NeedsReissuing(cert, allDomains, cfg.RenewBeforeDays, logger)
6969
if err != nil {
7070
failedDomains = append(failedDomains, mainDomain)
7171
logger.Error(err)
7272
continue
7373
}
7474

75-
if needsRenewing {
75+
if needsReissuing {
7676
logger.Infof("obtaining certificate for %s", mainDomain)
7777
err := certificate.ObtainCertificate(acmeClient, vaultClient, allDomains,
7878
cfg.DNSAddress, cfg.Acme.DNSChallengeProvider, cfg.Acme.DNSPropagationRequirement)

pkg/certificate/certificate.go

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,27 +63,59 @@ func GetCertificate(domain string, vault *vault.VaultClient) (*x509.Certificate,
6363
return nil, nil
6464
}
6565

66-
// NeedsRenewing checks if certificate expiration date is earlier than configured in config.Cfg.RenewBeforeDays
67-
func NeedsRenewing(certificate *x509.Certificate, domain string, days int, logger *logrus.Logger) (bool, error) {
66+
// NeedsReissuing checks if certificate domains and required domains match
67+
// and if certificate expiration date is earlier than configured in config.Cfg.RenewBeforeDays
68+
func NeedsReissuing(certificate *x509.Certificate, domains []string, days int, logger *logrus.Logger) (bool, error) {
6869
if certificate == nil {
6970
return true, nil
7071
}
7172

7273
if certificate.IsCA {
73-
return true, fmt.Errorf("certificate bundle for %s starts with a CA certificate", domain)
74+
return true, fmt.Errorf("certificate bundle for %s starts with a CA certificate", domains[0])
75+
}
76+
77+
// Check if all domains are in certificate DNS names
78+
if !arraysEqual(domains, certificate.DNSNames) {
79+
logger.Printf("certificate %s domains changed, it needs reissuing", domains[0])
80+
logger.Printf("certificate domains: %v", certificate.DNSNames)
81+
logger.Printf("required domains: %v", domains)
82+
return true, nil
7483
}
7584

7685
notAfter := int(time.Until(certificate.NotAfter).Hours() / 24.0)
7786
logger.Printf("certificate is valid for %v more days", notAfter)
7887
if notAfter > days {
79-
logger.Printf("certificate for %s does not need renewing", domain)
88+
logger.Printf("certificate for %s does not need renewing", domains[0])
8089

8190
return false, nil
8291
}
8392

8493
return true, nil
8594
}
8695

96+
func arraysEqual(array1 []string, array2 []string) bool {
97+
if len(array1) != len(array2) {
98+
return false
99+
}
100+
101+
for _, v := range array1 {
102+
if !arrayContains(array2, v) {
103+
return false
104+
}
105+
}
106+
107+
return true
108+
}
109+
110+
func arrayContains(array []string, element string) bool {
111+
for _, a := range array {
112+
if a == element {
113+
return true
114+
}
115+
}
116+
return false
117+
}
118+
87119
func vaultCertLocation(domain string) string {
88120
return "certificates/" + domain
89121
}

pkg/certificate/certificate_test.go

Lines changed: 44 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,44 +12,70 @@ import (
1212
"github.com/thanos-io/thanos/pkg/testutil"
1313
)
1414

15-
func TestNeedsRenewing(t *testing.T) {
15+
func TestNeedsReissuing(t *testing.T) {
1616
template := &x509.Certificate{
1717
IsCA: false,
1818
SerialNumber: big.NewInt(1234),
1919
NotBefore: time.Now(),
20+
DNSNames: []string{"test.com", "www.test.com", "*.test.com"},
2021
NotAfter: time.Now().AddDate(0 /* years */, 3 /* months */, 0 /* days */),
2122
}
2223
logger := logrus.New()
2324

2425
certificate := generateCert(t, template)
2526

2627
for _, tcase := range []struct {
27-
tcaseName string
28-
certificate *x509.Certificate
29-
renewDays int
30-
expectedResult bool
28+
tcaseName string
29+
requiredDomains []string
30+
certificate *x509.Certificate
31+
renewDays int
32+
expectedResult bool
3133
}{
3234
{
33-
tcaseName: "certificate expires after three months (90 days), renewDays = 30",
34-
certificate: certificate,
35-
renewDays: 30,
36-
expectedResult: false,
35+
tcaseName: "certificate expires after three months (90 days), renewDays = 30, required domains correct",
36+
requiredDomains: []string{"test.com", "www.test.com", "*.test.com"},
37+
certificate: certificate,
38+
renewDays: 30,
39+
expectedResult: false,
3740
},
3841
{
39-
tcaseName: "certificate expires after three months (90 days), renewDays = 100",
40-
certificate: certificate,
41-
renewDays: 100,
42-
expectedResult: true,
42+
tcaseName: "certificate expires after three months (90 days), renewDays = 100, required domains correct",
43+
requiredDomains: []string{"test.com", "www.test.com", "*.test.com"},
44+
certificate: certificate,
45+
renewDays: 100,
46+
expectedResult: true,
4347
},
4448
{
45-
tcaseName: "nil certificate, renew days 30",
46-
certificate: nil,
47-
renewDays: 30,
48-
expectedResult: true,
49+
tcaseName: "nil certificate, renew days 30, required domains correct",
50+
requiredDomains: []string{"test.com", "www.test.com", "*.test.com"},
51+
certificate: nil,
52+
renewDays: 30,
53+
expectedResult: true,
54+
},
55+
{
56+
tcaseName: "certificate expires after three months (90 days), renewDays = 30, fewer required domains than certificate has",
57+
requiredDomains: []string{"www.test.com", "*.test.com"},
58+
certificate: certificate,
59+
renewDays: 30,
60+
expectedResult: true,
61+
},
62+
{
63+
tcaseName: "certificate expires after three months (90 days), renewDays = 30, more required domains than certificate has",
64+
requiredDomains: []string{"test.com", "www.test.com", "*.test.com", "additional.test.com"},
65+
certificate: certificate,
66+
renewDays: 30,
67+
expectedResult: true,
68+
},
69+
{
70+
tcaseName: "certificate expires after three months (90 days), renewDays = 30, different required domains than certificate has",
71+
requiredDomains: []string{"test.com", "www.test.com", "different.test.com"},
72+
certificate: certificate,
73+
renewDays: 30,
74+
expectedResult: true,
4975
},
5076
} {
5177
t.Run(tcase.tcaseName, func(t *testing.T) {
52-
result, err := NeedsRenewing(tcase.certificate, "test.com", tcase.renewDays, logger)
78+
result, err := NeedsReissuing(tcase.certificate, tcase.requiredDomains, tcase.renewDays, logger)
5379
testutil.Ok(t, err)
5480
testutil.Equals(t, tcase.expectedResult, result)
5581
})

0 commit comments

Comments
 (0)