//go:build devcert package tls import ( "crypto/rand" "crypto/rsa" "crypto/tls" "crypto/x509" "crypto/x509/pkix" "encoding/pem" "math/big" "net" "time" log "github.com/sirupsen/logrus" ) func ServerQUICTLSConfig(originTLSCfg *tls.Config) (*tls.Config, error) { if originTLSCfg == nil { log.Warnf("QUIC server will use self signed certificate for testing!") return generateTestTLSConfig() } cfg := originTLSCfg.Clone() cfg.NextProtos = []string{nbalpn} return cfg, nil } // GenerateTestTLSConfig creates a self-signed certificate for testing func generateTestTLSConfig() (*tls.Config, error) { log.Infof("generating test TLS config") privateKey, err := rsa.GenerateKey(rand.Reader, 2048) if err != nil { return nil, err } template := x509.Certificate{ SerialNumber: big.NewInt(1), Subject: pkix.Name{ Organization: []string{"Test Organization"}, }, NotBefore: time.Now(), NotAfter: time.Now().Add(time.Hour * 24 * 180), // Valid for 180 days KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, ExtKeyUsage: []x509.ExtKeyUsage{ x509.ExtKeyUsageServerAuth, }, BasicConstraintsValid: true, DNSNames: []string{"localhost"}, IPAddresses: []net.IP{net.ParseIP("127.0.0.1")}, } // Create certificate certDER, err := x509.CreateCertificate(rand.Reader, &template, &template, &privateKey.PublicKey, privateKey) if err != nil { return nil, err } certPEM := pem.EncodeToMemory(&pem.Block{ Type: "CERTIFICATE", Bytes: certDER, }) privateKeyPEM := pem.EncodeToMemory(&pem.Block{ Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(privateKey), }) tlsCert, err := tls.X509KeyPair(certPEM, privateKeyPEM) if err != nil { return nil, err } return &tls.Config{ Certificates: []tls.Certificate{tlsCert}, NextProtos: []string{nbalpn}, }, nil }