blob: bed0e48bd207d8e842fa5fe80cac66f8b3d31aa6 [file] [log] [blame]
package main
import (
"crypto/tls"
"fmt"
"time"
"github.com/cloudflare/cfssl/csr"
"github.com/cloudflare/cfssl/signer"
"github.com/golang/glog"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
)
func (p *prodvider) selfCreds() grpc.ServerOption {
glog.Infof("Bootstrapping certificate for self (%q)...", flagProdviderCN)
// Create a key and CSR.
csrPEM, keyPEM, err := p.makeSelfCSR()
if err != nil {
glog.Exitf("Could not generate key and CSR for self: %v", err)
}
// Create a cert
certPEM, err := p.makeSelfCertificate(csrPEM)
if err != nil {
glog.Exitf("Could not sign certificate for self: %v", err)
}
serverCert, err := tls.X509KeyPair(certPEM, keyPEM)
if err != nil {
glog.Exitf("Could not use gRPC certificate: %v", err)
}
signerCert, _ := p.sign.Certificate("", "")
serverCert.Certificate = append(serverCert.Certificate, signerCert.Raw)
return grpc.Creds(credentials.NewTLS(&tls.Config{
Certificates: []tls.Certificate{serverCert},
}))
}
func (p *prodvider) makeSelfCSR() ([]byte, []byte, error) {
signerCert, _ := p.sign.Certificate("", "")
req := &csr.CertificateRequest{
CN: flagProdviderCN,
KeyRequest: &csr.BasicKeyRequest{
A: "rsa",
S: 4096,
},
Names: []csr.Name{
{
C: signerCert.Subject.Country[0],
ST: signerCert.Subject.Province[0],
L: signerCert.Subject.Locality[0],
O: signerCert.Subject.Organization[0],
OU: signerCert.Subject.OrganizationalUnit[0],
},
},
}
g := &csr.Generator{
Validator: func(req *csr.CertificateRequest) error { return nil },
}
return g.ProcessRequest(req)
}
func (p *prodvider) makeSelfCertificate(csr []byte) ([]byte, error) {
req := signer.SignRequest{
Hosts: []string{},
Request: string(csr),
Profile: "server",
}
return p.sign.Sign(req)
}
func (p *prodvider) makeKubernetesCSR(username, o string) ([]byte, []byte, error) {
signerCert, _ := p.sign.Certificate("", "")
req := &csr.CertificateRequest{
CN: username,
KeyRequest: &csr.BasicKeyRequest{
A: "rsa",
S: 4096,
},
Names: []csr.Name{
{
C: signerCert.Subject.Country[0],
ST: signerCert.Subject.Province[0],
L: signerCert.Subject.Locality[0],
O: o,
OU: fmt.Sprintf("Prodvider Kubernetes Cert for %s/%s", username, o),
},
},
}
g := &csr.Generator{
Validator: func(req *csr.CertificateRequest) error { return nil },
}
return g.ProcessRequest(req)
}
func (p *prodvider) makeKubernetesCertificate(csr []byte, notAfter time.Time) ([]byte, error) {
req := signer.SignRequest{
Hosts: []string{},
Request: string(csr),
Profile: "client",
NotAfter: notAfter,
}
return p.sign.Sign(req)
}