package tlscert import ( "crypto/ecdsa" "crypto/elliptic" "crypto/rand" "crypto/tls" "crypto/x509" "crypto/x509/pkix" "fmt" "math/big" "net" "time" ) // GenerateSelfSigned erzeugt ein frisches, selbstsigniertes ECDSA-P256- // Zertifikat für host (z. B. "127.0.0.1") — ausschließlich für Tests // dieses Moduls, kein Ersatz für echte Zertifikatsverwaltung im Betrieb. func GenerateSelfSigned(host string) (tls.Certificate, error) { priv, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) if err != nil { return tls.Certificate{}, fmt.Errorf("tlscert: schlüssel erzeugen: %w", err) } serial, err := rand.Int(rand.Reader, new(big.Int).Lsh(big.NewInt(1), 128)) if err != nil { return tls.Certificate{}, fmt.Errorf("tlscert: seriennummer erzeugen: %w", err) } template := x509.Certificate{ SerialNumber: serial, Subject: pkix.Name{CommonName: host}, NotBefore: time.Now().Add(-time.Hour), NotAfter: time.Now().Add(24 * time.Hour), KeyUsage: x509.KeyUsageDigitalSignature | x509.KeyUsageKeyEncipherment, ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, } if ip := net.ParseIP(host); ip != nil { template.IPAddresses = []net.IP{ip} } else { template.DNSNames = []string{host} } der, err := x509.CreateCertificate(rand.Reader, &template, &template, &priv.PublicKey, priv) if err != nil { return tls.Certificate{}, fmt.Errorf("tlscert: zertifikat erzeugen: %w", err) } return tls.Certificate{Certificate: [][]byte{der}, PrivateKey: priv}, nil }