package handler import ( "context" "crypto/ecdsa" "crypto/elliptic" "crypto/rand" "crypto/x509" "crypto/x509/pkix" "encoding/pem" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "math/big" "time" ) func generateSelfSignedCertificate(domain string) (*x509.Certificate, *ecdsa.PrivateKey, error) { priv, err := ecdsa.GenerateKey(elliptic.P384(), rand.Reader) if err != nil { return nil, nil, err } notBefore := time.Now() notAfter := notBefore.Add(3650 * 24 * time.Hour) // 10年有效期 serialNumber, err := rand.Int(rand.Reader, new(big.Int).Lsh(big.NewInt(1), 128)) if err != nil { return nil, nil, err } template := x509.Certificate{ SerialNumber: serialNumber, Subject: pkix.Name{ CommonName: domain, }, NotBefore: notBefore, NotAfter: notAfter, KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, BasicConstraintsValid: true, } certDER, err := x509.CreateCertificate(rand.Reader, &template, &template, &priv.PublicKey, priv) if err != nil { return nil, nil, err } cert, err := x509.ParseCertificate(certDER) if err != nil { return nil, nil, err } return cert, priv, nil } func createK8sSecret(clientset *kubernetes.Clientset, namespace, secretName string, cert *x509.Certificate, key *ecdsa.PrivateKey) error { // Encode certificate and private key to PEM format certPEM := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: cert.Raw}) keyBytes, err := x509.MarshalECPrivateKey(key) if err != nil { return err } keyPEM := pem.EncodeToMemory(&pem.Block{Type: "EC PRIVATE KEY", Bytes: keyBytes}) // Create a Kubernetes Secret secret := map[string][]byte{ "tls.crt": certPEM, "tls.key": keyPEM, } _, err = clientset.CoreV1().Secrets(namespace).Create(context.TODO(), &v1.Secret{ ObjectMeta: metav1.ObjectMeta{ Name: secretName, Namespace: namespace, }, Type: v1.SecretTypeTLS, Data: secret, }, metav1.CreateOptions{}) return err }