mkcert.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package tls
  2. import (
  3. "crypto/rand"
  4. "crypto/rsa"
  5. "crypto/tls"
  6. "crypto/x509"
  7. "crypto/x509/pkix"
  8. "encoding/pem"
  9. "math/big"
  10. "time"
  11. )
  12. func GenerateKeyPair(timeFunc func() time.Time, serverName string) (*tls.Certificate, error) {
  13. if timeFunc == nil {
  14. timeFunc = time.Now
  15. }
  16. key, err := rsa.GenerateKey(rand.Reader, 2048)
  17. if err != nil {
  18. return nil, err
  19. }
  20. serialNumber, err := rand.Int(rand.Reader, new(big.Int).Lsh(big.NewInt(1), 128))
  21. if err != nil {
  22. return nil, err
  23. }
  24. template := &x509.Certificate{
  25. SerialNumber: serialNumber,
  26. NotBefore: timeFunc().Add(time.Hour * -1),
  27. NotAfter: timeFunc().Add(time.Hour),
  28. KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
  29. ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
  30. BasicConstraintsValid: true,
  31. Subject: pkix.Name{
  32. CommonName: serverName,
  33. },
  34. DNSNames: []string{serverName},
  35. }
  36. publicDer, err := x509.CreateCertificate(rand.Reader, template, template, key.Public(), key)
  37. if err != nil {
  38. return nil, err
  39. }
  40. privateDer, err := x509.MarshalPKCS8PrivateKey(key)
  41. if err != nil {
  42. return nil, err
  43. }
  44. publicPem := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: publicDer})
  45. privPem := pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: privateDer})
  46. keyPair, err := tls.X509KeyPair(publicPem, privPem)
  47. if err != nil {
  48. return nil, err
  49. }
  50. return &keyPair, err
  51. }