package internals import ( "crypto/rand" "crypto/rsa" "crypto/tls" "crypto/x509" "crypto/x509/pkix" "io" "math/big" "net" "strings" "time" ) // tlsHandshakeFilter drops "TLS handshake error" log lines (expected noise from // browsers rejecting self-signed certs) and forwards everything else unchanged. type tlsHandshakeFilter struct{ w io.Writer } func (f tlsHandshakeFilter) Write(p []byte) (int, error) { if strings.Contains(string(p), "TLS handshake error") { return len(p), nil } return f.w.Write(p) } func generateSelfSignedCert() (tls.Certificate, error) { priv, _ := rsa.GenerateKey(rand.Reader, 2048) serial, _ := rand.Int(rand.Reader, new(big.Int).Lsh(big.NewInt(1), 128)) tmpl := x509.Certificate{ SerialNumber: serial, Subject: pkix.Name{Organization: []string{"GoTermix"}, CommonName: "localhost"}, NotBefore: time.Now(), NotAfter: time.Now().Add(365 * 24 * time.Hour), KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, DNSNames: []string{"localhost"}, IPAddresses: []net.IP{net.ParseIP("127.0.0.1"), net.ParseIP("::1")}, } der, _ := x509.CreateCertificate(rand.Reader, &tmpl, &tmpl, &priv.PublicKey, priv) return tls.Certificate{Certificate: [][]byte{der}, PrivateKey: priv}, nil }