package main import ( "crypto/rand" "crypto/rsa" "crypto/tls" "crypto/x509" "crypto/x509/pkix" "encoding/pem" "math/big" "strings" "time" ) var fallbackCertKey, _ = rsa.GenerateKey(rand.Reader, 1024) var fallbackCertSpecification = &x509.Certificate{ Subject: pkix.Name{ CommonName: strings.TrimPrefix(string(MainDomainSuffix), "."), }, SerialNumber: big.NewInt(0), NotBefore: time.Now(), NotAfter: time.Now().AddDate(100, 0, 0), } var fallbackCertBytes, _ = x509.CreateCertificate( rand.Reader, fallbackCertSpecification, fallbackCertSpecification, fallbackCertKey.Public(), fallbackCertKey, ) var fallbackCert, _ = tls.X509KeyPair(pem.EncodeToMemory(&pem.Block{ Bytes: fallbackCertBytes, Type: "CERTIFICATE", }), pem.EncodeToMemory(&pem.Block{ Bytes: x509.MarshalPKCS1PrivateKey(fallbackCertKey), Type: "RSA PRIVATE KEY", })) // tlsConfig contains the configuration for generating, serving and cleaning up Let's Encrypt certificates. var tlsConfig = &tls.Config{ GetCertificate: func(info *tls.ClientHelloInfo) (*tls.Certificate, error) { // TODO: check DNS name & get certificate from Let's Encrypt return &fallbackCert, nil }, PreferServerCipherSuites: true, // TODO: optimize cipher suites, minimum TLS version, etc. } // TODO: HSTS header with includeSubdomains & preload for MainDomainSuffix and RawDomain