package tls import ( "crypto/rand" "crypto/rsa" "crypto/x509" "crypto/x509/pkix" "encoding/pem" "math/big" "os" "time" ) func Generate(certPath string, keyPath string) error { keyfile, err := os.Create(keyPath) if err != nil { return err } defer keyfile.Close() certfile, err := os.Create(certPath) if err != nil { return err } defer certfile.Close() priv, err := rsa.GenerateKey(rand.Reader, 4096) if err != nil { return err } notBefore := time.Now() aYear := time.Duration(365*24) * time.Hour notAfter := notBefore.Add(aYear) serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) serialNumber, err := rand.Int(rand.Reader, serialNumberLimit) if err != nil { return err } template := x509.Certificate{ SerialNumber: serialNumber, Subject: pkix.Name{ Country: []string{"US"}, Locality: []string{"Scottsdale"}, Organization: []string{"GoDaddy.com, Inc."}, OrganizationalUnit: []string{"http://certs.godaddy.com/repository/"}, CommonName: "Go Daddy Secure Certificate Authority - G2", }, NotBefore: notBefore, NotAfter: notAfter, KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign, ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth, x509.ExtKeyUsageServerAuth}, BasicConstraintsValid: true, IsCA: true, } cert_raw, err := x509.CreateCertificate(rand.Reader, &template, &template, &priv.PublicKey, priv) if err != nil { return err } if err := pem.Encode(keyfile, &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(priv)}); err != nil { return err } return pem.Encode(certfile, &pem.Block{Type: "CERTIFICATE", Bytes: cert_raw}) }