Skip to content

Commit fca9175

Browse files
committed
Change how systemroot is created
Signed-off-by: Todd Short <[email protected]>
1 parent 2092ee9 commit fca9175

File tree

1 file changed

+69
-23
lines changed

1 file changed

+69
-23
lines changed

internal/shared/util/http/certutil.go

Lines changed: 69 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,46 +5,92 @@ import (
55
"fmt"
66
"os"
77
"path/filepath"
8+
"strings"
89

910
"github.com/go-logr/logr"
1011
)
1112

12-
func NewCertPool(caDir string, log logr.Logger) (*x509.CertPool, error) {
13-
caCertPool, err := x509.SystemCertPool()
13+
func readCertFile(pool *x509.CertPool, file string, log logr.Logger) (int, error) {
14+
var count int
15+
// These might be symlinks pointing to directories, so use Stat() to resolve
16+
fi, err := os.Stat(file)
1417
if err != nil {
15-
return nil, err
18+
return count, err
1619
}
17-
if caDir == "" {
18-
return caCertPool, nil
20+
if fi.IsDir() {
21+
log.V(defaultLogLevel).Info("skip directory", "name", file)
22+
return count, nil
1923
}
24+
log.V(defaultLogLevel).Info("load certificate", "name", file, "size", fi.Size(), "modtime", fi.ModTime())
25+
data, err := os.ReadFile(file)
26+
if err != nil {
27+
return count, fmt.Errorf("error reading cert file %q: %w", file, err)
28+
}
29+
// The return indicates if any certs were added
30+
if pool.AppendCertsFromPEM(data) {
31+
count++
32+
}
33+
logPem(data, filepath.Base(file), filepath.Dir(file), "loading certificate file", log)
34+
35+
return count, nil
36+
}
2037

21-
dirEntries, err := os.ReadDir(caDir)
38+
func readCertDir(pool *x509.CertPool, dir string, log logr.Logger) (int, error) {
39+
dirEntries, err := os.ReadDir(dir)
2240
if err != nil {
23-
return nil, err
41+
return 0, err
2442
}
25-
count := 0
43+
var count int
2644

2745
for _, e := range dirEntries {
28-
file := filepath.Join(caDir, e.Name())
29-
// These might be symlinks pointing to directories, so use Stat() to resolve
30-
fi, err := os.Stat(file)
46+
file := filepath.Join(dir, e.Name())
47+
c, err := readCertFile(pool, file, log)
3148
if err != nil {
32-
return nil, err
49+
return count, err
3350
}
34-
if fi.IsDir() {
35-
log.V(defaultLogLevel).Info("skip directory", "name", e.Name())
36-
continue
37-
}
38-
log.V(defaultLogLevel).Info("load certificate", "name", e.Name(), "size", fi.Size(), "modtime", fi.ModTime())
39-
data, err := os.ReadFile(file)
51+
count += c
52+
}
53+
return count, nil
54+
}
55+
56+
// This function looks explicitly at the SSL environment, and
57+
// uses it to create a "fresh" system cert pool
58+
func systemCertPool(log logr.Logger) (*x509.CertPool, error) {
59+
sslCertDir := os.Getenv("SSL_CERT_DIR")
60+
sslCertFile := os.Getenv("SSL_CERT_FILE")
61+
if sslCertDir == "" && sslCertFile == "" {
62+
log.V(defaultLogLevel).Info("SystemCertPool: SSL environment not set")
63+
return x509.SystemCertPool()
64+
}
65+
log.V(defaultLogLevel).Info("SystemCertPool: SSL environment set", "SSL_CERT_DIR", sslCertDir, "SSL_CERT_FILE", sslCertFile)
66+
pool := x509.NewCertPool()
67+
for _, d := range strings.Split(sslCertDir, ":") {
68+
_, err := readCertDir(pool, d, log)
4069
if err != nil {
41-
return nil, fmt.Errorf("error reading cert file %q: %w", file, err)
70+
return nil, err
4271
}
43-
// The return indicates if any certs were added
44-
if caCertPool.AppendCertsFromPEM(data) {
45-
count++
72+
}
73+
for _, d := range strings.Split(sslCertFile, ":") {
74+
_, err := readCertFile(pool, d, log)
75+
if err != nil {
76+
return nil, err
4677
}
47-
logPem(data, e.Name(), caDir, "loading certificate file", log)
78+
}
79+
return pool, nil
80+
}
81+
82+
func NewCertPool(caDir string, log logr.Logger) (*x509.CertPool, error) {
83+
caCertPool, err := systemCertPool(log)
84+
if err != nil {
85+
return nil, err
86+
}
87+
88+
if caDir == "" {
89+
return caCertPool, nil
90+
}
91+
count, err := readCertDir(caCertPool, caDir, log)
92+
if err != nil {
93+
return nil, err
4894
}
4995

5096
// Found no certs!

0 commit comments

Comments
 (0)