package main import ( "crypto/ecdsa" "crypto/elliptic" "crypto/rand" "crypto/tls" "crypto/x509" "crypto/x509/pkix" "encoding/pem" "math/big" "net/http" "time" ) // selfSignedCert generates a fresh ECDSA P-256 self-signed cert+key // at startup. Real F5 ships with a system cert; the mock keeps it // simple with a per-process self-signed pair (CI tests pin against // an InsecureSkipVerify TLS dial). func selfSignedCert() ([]byte, []byte) { priv, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) if err != nil { panic(err) } tmpl := x509.Certificate{ SerialNumber: big.NewInt(1), Subject: pkix.Name{CommonName: "f5-mock-icontrol"}, NotBefore: time.Now().Add(-time.Hour), NotAfter: time.Now().Add(365 * 24 * time.Hour), KeyUsage: x509.KeyUsageDigitalSignature | x509.KeyUsageKeyEncipherment, ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, DNSNames: []string{"f5-mock-icontrol", "localhost"}, } der, err := x509.CreateCertificate(rand.Reader, &tmpl, &tmpl, &priv.PublicKey, priv) if err != nil { panic(err) } certPEM := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: der}) keyDER, err := x509.MarshalECPrivateKey(priv) if err != nil { panic(err) } keyPEM := pem.EncodeToMemory(&pem.Block{Type: "EC PRIVATE KEY", Bytes: keyDER}) return certPEM, keyPEM } // writeAndServeTLS loads the in-memory cert+key into the server // without touching disk. func writeAndServeTLS(srv *http.Server, certPEM, keyPEM []byte) error { pair, err := tls.X509KeyPair(certPEM, keyPEM) if err != nil { return err } srv.TLSConfig = &tls.Config{ MinVersion: tls.VersionTLS12, Certificates: []tls.Certificate{pair}, } return srv.ListenAndServeTLS("", "") }