@@ -25,18 +25,28 @@ func GenCA() (*x509.Certificate, crypto.Signer, error) {
2525 return caCert , caKey , nil
2626}
2727
28+ // Deprecated: Use LoadOrGenCAChain instead as it supports intermediate CAs
2829func LoadOrGenCA () (* x509.Certificate , crypto.Signer , error ) {
29- cert , key , err := loadCA ()
30+ chain , signer , err := LoadOrGenCAChain ()
31+ if err != nil {
32+ return nil , nil , err
33+ }
34+ return chain [0 ], signer , err
35+ }
36+
37+ func LoadOrGenCAChain () ([]* x509.Certificate , crypto.Signer , error ) {
38+ certs , key , err := loadCA ()
3039 if err == nil {
31- return cert , key , nil
40+ return certs , key , nil
3241 }
3342
34- cert , key , err = GenCA ()
43+ cert , key , err : = GenCA ()
3544 if err != nil {
3645 return nil , nil , err
3746 }
47+ certs = []* x509.Certificate {cert }
3848
39- certBytes , keyBytes , err := Marshal ( cert , key )
49+ certBytes , keyBytes , err := MarshalChain ( key , certs ... )
4050 if err != nil {
4151 return nil , nil , err
4252 }
@@ -53,14 +63,22 @@ func LoadOrGenCA() (*x509.Certificate, crypto.Signer, error) {
5363 return nil , nil , err
5464 }
5565
56- return cert , key , nil
66+ return certs , key , nil
5767}
5868
59- func loadCA () (* x509.Certificate , crypto.Signer , error ) {
60- return LoadCerts ("./certs/ca.pem" , "./certs/ca.key" )
69+ func loadCA () ([] * x509.Certificate , crypto.Signer , error ) {
70+ return LoadCertsChain ("./certs/ca.pem" , "./certs/ca.key" )
6171}
6272
6373func LoadCA (caPem , caKey []byte ) (* x509.Certificate , crypto.Signer , error ) {
74+ chain , signer , err := LoadCAChain (caPem , caKey )
75+ if err != nil {
76+ return nil , nil , err
77+ }
78+ return chain [0 ], signer , nil
79+ }
80+
81+ func LoadCAChain (caPem , caKey []byte ) ([]* x509.Certificate , crypto.Signer , error ) {
6482 key , err := cert .ParsePrivateKeyPEM (caKey )
6583 if err != nil {
6684 return nil , nil , err
@@ -70,15 +88,24 @@ func LoadCA(caPem, caKey []byte) (*x509.Certificate, crypto.Signer, error) {
7088 return nil , nil , fmt .Errorf ("key is not a crypto.Signer" )
7189 }
7290
73- cert , err := ParseCertPEM (caPem )
91+ certs , err := cert . ParseCertsPEM (caPem )
7492 if err != nil {
7593 return nil , nil , err
7694 }
7795
78- return cert , signer , nil
96+ return certs , signer , nil
7997}
8098
99+ // Deprecated: Use LoadCertsChain instead as it supports intermediate CAs
81100func LoadCerts (certFile , keyFile string ) (* x509.Certificate , crypto.Signer , error ) {
101+ chain , signer , err := LoadCertsChain (certFile , keyFile )
102+ if err != nil {
103+ return nil , nil , err
104+ }
105+ return chain [0 ], signer , err
106+ }
107+
108+ func LoadCertsChain (certFile , keyFile string ) ([]* x509.Certificate , crypto.Signer , error ) {
82109 caPem , err := ioutil .ReadFile (certFile )
83110 if err != nil {
84111 return nil , nil , err
@@ -88,5 +115,5 @@ func LoadCerts(certFile, keyFile string) (*x509.Certificate, crypto.Signer, erro
88115 return nil , nil , err
89116 }
90117
91- return LoadCA (caPem , caKey )
118+ return LoadCAChain (caPem , caKey )
92119}
0 commit comments