in pkg/webhook/webhook.go [610:706]
func (w *Config) genSelfSignedCert() (caPEMByte, certPEMByte, keyPEMByte []byte, err error) {
// CA config
ca := &x509.Certificate{
SerialNumber: big.NewInt(2022),
Subject: pkix.Name{
CommonName: "fleet.azure.com",
OrganizationalUnit: []string{"Azure Kubernetes Service"},
Organization: []string{"Microsoft"},
Locality: []string{"Redmond"},
Province: []string{"Washington"},
Country: []string{"United States of America"},
},
NotBefore: time.Now(),
NotAfter: time.Now().AddDate(10, 0, 0), // Set expiration time to be 10 years for now
IsCA: true,
ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth, x509.ExtKeyUsageServerAuth},
KeyUsage: x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,
BasicConstraintsValid: true,
}
// CA private key
caPrvKey, err := rsa.GenerateKey(rand.Reader, 4096)
if err != nil {
return nil, nil, nil, err
}
// Self signed CA certificate
caBytes, err := x509.CreateCertificate(rand.Reader, ca, ca, &caPrvKey.PublicKey, caPrvKey)
if err != nil {
return nil, nil, nil, err
}
// PEM encode CA cert
caPEM := new(bytes.Buffer)
if err := pem.Encode(caPEM, &pem.Block{
Type: "CERTIFICATE",
Bytes: caBytes,
}); err != nil {
return nil, nil, nil, err
}
caPEMByte = caPEM.Bytes()
dnsNames := []string{
fmt.Sprintf("%s.%s.svc", w.serviceName, w.serviceNamespace),
fmt.Sprintf("%s.%s.svc.cluster.local", w.serviceName, w.serviceNamespace),
}
// server cert config
cert := &x509.Certificate{
DNSNames: dnsNames,
SerialNumber: big.NewInt(2022),
Subject: pkix.Name{
CommonName: fmt.Sprintf("%s.cert.server", w.serviceName),
OrganizationalUnit: []string{"Azure Kubernetes Service"},
Organization: []string{"Microsoft"},
Locality: []string{"Redmond"},
Province: []string{"Washington"},
Country: []string{"United States of America"},
},
NotBefore: time.Now(),
NotAfter: time.Now().AddDate(10, 0, 0),
SubjectKeyId: []byte{1, 2, 3, 4, 5},
ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth, x509.ExtKeyUsageServerAuth},
KeyUsage: x509.KeyUsageDigitalSignature,
}
// server private key
certPrvKey, err := rsa.GenerateKey(rand.Reader, 4096)
if err != nil {
return nil, nil, nil, err
}
// sign the server cert
certBytes, err := x509.CreateCertificate(rand.Reader, cert, ca, &certPrvKey.PublicKey, caPrvKey)
if err != nil {
return nil, nil, nil, err
}
// PEM encode the server cert and key
certPEM := new(bytes.Buffer)
if err := pem.Encode(certPEM, &pem.Block{
Type: "CERTIFICATE",
Bytes: certBytes,
}); err != nil {
return nil, nil, nil, err
}
certPEMByte = certPEM.Bytes()
certPrvKeyPEM := new(bytes.Buffer)
if err := pem.Encode(certPrvKeyPEM, &pem.Block{
Type: "RSA PRIVATE KEY",
Bytes: x509.MarshalPKCS1PrivateKey(certPrvKey),
}); err != nil {
return nil, nil, nil, err
}
keyPEMByte = certPrvKeyPEM.Bytes()
return caPEMByte, certPEMByte, keyPEMByte, nil
}