toolkit/certificates/certcreator/cert_creator.go (45 lines of code) (raw):
package certcreator
import (
"context"
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"io"
"math/big"
"github.com/Azure/webhook-tls-manager/toolkit/log"
"k8s.io/legacy-cloud-providers/azure/retry"
)
type CertCreatorImp struct {
}
func NewCertCreator() CertCreator {
return &CertCreatorImp{}
}
func (c *CertCreatorImp) GenerateSN() (*big.Int, error) {
return rand.Int(rand.Reader, new(big.Int).Lsh(big.NewInt(1), 128))
}
func (c *CertCreatorImp) CreateCertificate(rand io.Reader, template, parent *x509.Certificate, publicKey interface{}, privateKey interface{}) ([]byte, error) {
return x509.CreateCertificate(rand, template, parent, publicKey, privateKey)
}
func (c *CertCreatorImp) ParseCertificate(derBytes []byte) (*x509.Certificate, error) {
return x509.ParseCertificate(derBytes)
}
func (c *CertCreatorImp) CreateCertificateWithPublicKey(ctx context.Context, csr *x509.Certificate, publicKey *rsa.PublicKey, caCert *x509.Certificate, caKey *rsa.PrivateKey) (*x509.Certificate, *retry.Error) {
sn, err := c.GenerateSN()
if err != nil {
log.MustGetLogger(ctx).Errorf(ctx, "generate serial number failed: %s", err)
return nil, retry.NewError(false, err)
}
csr.SerialNumber = sn
certDerBytes, err := c.CreateCertificate(rand.Reader, csr, caCert, publicKey, caKey)
if err != nil {
log.MustGetLogger(ctx).Errorf(ctx, "createCertificateFunc failed: %s", err)
return nil, retry.NewError(false, err)
}
certificate, err := c.ParseCertificate(certDerBytes)
if err != nil {
log.MustGetLogger(ctx).Errorf(ctx, "parseCertificateFunc failed: %s", err)
return nil, retry.NewError(false, err)
}
log.MustGetLogger(ctx).Info(ctx, "certificate created successfully")
return certificate, nil
}