Files
dynamiclistener/factory/ca.go

120 lines
2.6 KiB
Go
Raw Normal View History

package factory
import (
2019-11-15 23:43:02 +00:00
"crypto"
"crypto/x509"
2019-11-15 23:43:02 +00:00
"fmt"
"io/ioutil"
"os"
"time"
2019-11-15 23:43:02 +00:00
"github.com/rancher/dynamiclistener/cert"
)
2019-11-15 23:43:02 +00:00
func GenCA() (*x509.Certificate, crypto.Signer, error) {
caKey, err := NewPrivateKey()
if err != nil {
return nil, nil, err
}
caCert, err := NewSelfSignedCACert(caKey, fmt.Sprintf("dynamiclistener-ca@%d", time.Now().Unix()), "dynamiclistener-org")
if err != nil {
return nil, nil, err
}
return caCert, caKey, nil
}
// Deprecated: Use LoadOrGenCAChain instead as it supports intermediate CAs
2019-11-15 23:43:02 +00:00
func LoadOrGenCA() (*x509.Certificate, crypto.Signer, error) {
chain, signer, err := LoadOrGenCAChain()
if err != nil {
return nil, nil, err
}
return chain[0], signer, err
}
func LoadOrGenCAChain() ([]*x509.Certificate, crypto.Signer, error) {
certs, key, err := loadCA()
if err == nil {
return certs, key, nil
}
cert, key, err := GenCA()
if err != nil {
return nil, nil, err
}
certs = []*x509.Certificate{cert}
certBytes, keyBytes, err := MarshalChain(key, certs...)
if err != nil {
return nil, nil, err
}
if err := os.MkdirAll("./certs", 0700); err != nil {
return nil, nil, err
}
if err := ioutil.WriteFile("./certs/ca.pem", certBytes, 0600); err != nil {
return nil, nil, err
}
if err := ioutil.WriteFile("./certs/ca.key", keyBytes, 0600); err != nil {
return nil, nil, err
}
return certs, key, nil
}
func loadCA() ([]*x509.Certificate, crypto.Signer, error) {
return LoadCertsChain("./certs/ca.pem", "./certs/ca.key")
}
2020-01-30 22:18:44 -07:00
func LoadCA(caPem, caKey []byte) (*x509.Certificate, crypto.Signer, error) {
chain, signer, err := LoadCAChain(caPem, caKey)
if err != nil {
return nil, nil, err
}
return chain[0], signer, nil
}
func LoadCAChain(caPem, caKey []byte) ([]*x509.Certificate, crypto.Signer, error) {
2019-11-15 23:43:02 +00:00
key, err := cert.ParsePrivateKeyPEM(caKey)
if err != nil {
return nil, nil, err
}
2019-11-15 23:43:02 +00:00
signer, ok := key.(crypto.Signer)
if !ok {
return nil, nil, fmt.Errorf("key is not a crypto.Signer")
}
certs, err := cert.ParseCertsPEM(caPem)
if err != nil {
return nil, nil, err
}
return certs, signer, nil
}
2020-01-30 22:18:44 -07:00
// Deprecated: Use LoadCertsChain instead as it supports intermediate CAs
2020-01-30 22:18:44 -07:00
func LoadCerts(certFile, keyFile string) (*x509.Certificate, crypto.Signer, error) {
chain, signer, err := LoadCertsChain(certFile, keyFile)
if err != nil {
return nil, nil, err
}
return chain[0], signer, err
}
func LoadCertsChain(certFile, keyFile string) ([]*x509.Certificate, crypto.Signer, error) {
2020-01-30 22:18:44 -07:00
caPem, err := ioutil.ReadFile(certFile)
if err != nil {
return nil, nil, err
}
caKey, err := ioutil.ReadFile(keyFile)
if err != nil {
return nil, nil, err
}
return LoadCAChain(caPem, caKey)
2020-01-30 22:18:44 -07:00
}