package common import ( "crypto/rand" "crypto/rsa" "crypto/tls" "crypto/x509" "crypto/x509/pkix" "encoding/pem" "fmt" "log" "math/big" "time" ) // GenerateCerts create self signed certificate for local development use func GenerateCerts() (cert *tls.Certificate) { privKey, err := rsa.GenerateKey(rand.Reader, 2048) publicKey := &privKey.PublicKey serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) serialNumber, err := rand.Int(rand.Reader, serialNumberLimit) if err != nil { log.Fatalf("Failed to generate serial number: %s", err) } template := x509.Certificate{ SerialNumber: serialNumber, Subject: pkix.Name{ Organization: []string{"Lighwalletd developer"}, }, NotBefore: time.Now(), NotAfter: time.Now().Local().Add(time.Hour * 24 * 365), KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, BasicConstraintsValid: true, } // List of hostnames and IPs for the cert template.DNSNames = append(template.DNSNames, "localhost") certDER, err := x509.CreateCertificate(rand.Reader, &template, &template, publicKey, privKey) if err != nil { log.Fatalf("Failed to create certificate: %s", err) } // PEM encode the certificate (this is a standard TLS encoding) b := pem.Block{Type: "CERTIFICATE", Bytes: certDER} certPEM := pem.EncodeToMemory(&b) fmt.Printf("%s\n", certPEM) // PEM encode the private key privBytes, err := x509.MarshalPKCS8PrivateKey(privKey) if err != nil { log.Fatalf("Unable to marshal private key: %v", err) } keyPEM := pem.EncodeToMemory(&pem.Block{ Type: "RSA PRIVATE KEY", Bytes: privBytes, }) // Create a TLS cert using the private key and certificate tlsCert, err := tls.X509KeyPair(certPEM, keyPEM) if err != nil { log.Fatalf("invalid key pair: %v", err) } cert = &tlsCert return cert }