@@ -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