mkcert.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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 GenerateCertificate(timeFunc func() time.Time, serverName string) (*tls.Certificate, error) {
  13. privateKeyPem, publicKeyPem, err := GenerateKeyPair(timeFunc, serverName, timeFunc().Add(time.Hour))
  14. if err != nil {
  15. return nil, err
  16. }
  17. certificate, err := tls.X509KeyPair(publicKeyPem, privateKeyPem)
  18. if err != nil {
  19. return nil, err
  20. }
  21. return &certificate, err
  22. }
  23. func GenerateKeyPair(timeFunc func() time.Time, serverName string, expire time.Time) (privateKeyPem []byte, publicKeyPem []byte, err error) {
  24. if timeFunc == nil {
  25. timeFunc = time.Now
  26. }
  27. key, err := rsa.GenerateKey(rand.Reader, 2048)
  28. if err != nil {
  29. return
  30. }
  31. serialNumber, err := rand.Int(rand.Reader, new(big.Int).Lsh(big.NewInt(1), 128))
  32. if err != nil {
  33. return
  34. }
  35. template := &x509.Certificate{
  36. SerialNumber: serialNumber,
  37. NotBefore: timeFunc().Add(time.Hour * -1),
  38. NotAfter: expire,
  39. KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
  40. ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
  41. BasicConstraintsValid: true,
  42. Subject: pkix.Name{
  43. CommonName: serverName,
  44. },
  45. DNSNames: []string{serverName},
  46. }
  47. publicDer, err := x509.CreateCertificate(rand.Reader, template, template, key.Public(), key)
  48. if err != nil {
  49. return
  50. }
  51. privateDer, err := x509.MarshalPKCS8PrivateKey(key)
  52. if err != nil {
  53. return
  54. }
  55. publicKeyPem = pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: publicDer})
  56. privateKeyPem = pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: privateDer})
  57. return
  58. }