master
go 68 lines 1.25 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package x509check
4
5 import (
6 "crypto/x509"
7 "fmt"
8 "time"
9
10 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/oldmetrix"
11
12 "github.com/cloudflare/cfssl/revoke"
13 )
14
15 func (c *Collector) collect() (map[string]int64, error) {
16 certs, err := c.prov.certificates()
17 if err != nil {
18 return nil, err
19 }
20
21 if len(certs) == 0 {
22 return nil, fmt.Errorf("no certificate was provided by '%s'", c.Config.Source)
23 }
24
25 mx := make(map[string]int64)
26
27 if err := c.collectCertificates(mx, certs); err != nil {
28 return nil, err
29 }
30
31 return mx, nil
32 }
33
34 func (c *Collector) collectCertificates(mx map[string]int64, certs []*x509.Certificate) error {
35 for i, cert := range certs {
36 cn := cert.Subject.CommonName
37
38 if !c.seenCerts[cn] {
39 c.seenCerts[cn] = true
40 c.addCertCharts(cn, i)
41 }
42
43 px := fmt.Sprintf("cert_depth%d_", i)
44
45 mx[px+"expiry"] = int64(time.Until(cert.NotAfter).Seconds())
46
47 if i == 0 && c.CheckRevocation {
48 func() {
49 rev, ok, err := revoke.VerifyCertificateError(cert)
50 if err != nil {
51 c.Debug(err)
52 return
53 }
54 if !ok {
55 return
56 }
57 mx[px+"revoked"] = oldmetrix.Bool(rev)
58 mx[px+"not_revoked"] = oldmetrix.Bool(!rev)
59 }()
60 }
61
62 if !c.CheckFullChain {
63 break
64 }
65 }
66
67 return nil
68 }