cert.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package cert
  2. import (
  3. "crypto/rand"
  4. "crypto/rsa"
  5. "crypto/x509"
  6. "crypto/x509/pkix"
  7. "encoding/pem"
  8. "log"
  9. "math/big"
  10. "time"
  11. "v2ray.com/core/common"
  12. )
  13. //go:generate go run $GOPATH/src/v2ray.com/core/common/errors/errorgen/main.go -pkg cert -path Protocol,TLS,Cert
  14. type Certificate struct {
  15. // Cerificate in x509 format
  16. Certificate []byte
  17. // Private key in x509 format
  18. PrivateKey []byte
  19. }
  20. type Option func(*x509.Certificate)
  21. func Authority(isCA bool) Option {
  22. return func(cert *x509.Certificate) {
  23. cert.IsCA = isCA
  24. }
  25. }
  26. func Generate() (Certificate, error) {
  27. priv, err := rsa.GenerateKey(rand.Reader, 2048)
  28. common.Must(err)
  29. serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)
  30. serialNumber, err := rand.Int(rand.Reader, serialNumberLimit)
  31. if err != nil {
  32. log.Fatalf("failed to generate serial number: %s", err)
  33. }
  34. template := x509.Certificate{
  35. SerialNumber: serialNumber,
  36. Subject: pkix.Name{
  37. Organization: []string{"V2Ray Inc"},
  38. },
  39. NotBefore: time.Now().Add(time.Hour * -1),
  40. NotAfter: time.Now().Add(time.Hour),
  41. KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
  42. ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
  43. BasicConstraintsValid: true,
  44. DNSNames: []string{"www.v2ray.com", "v2ray.com"},
  45. }
  46. derBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, &priv.PublicKey, priv)
  47. common.Must(err)
  48. certPEM := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: derBytes})
  49. keyPEM := pem.EncodeToMemory(&pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(priv)})
  50. return Certificate{
  51. Certificate: certPEM,
  52. PrivateKey: keyPEM,
  53. }, nil
  54. }