cert.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. package cert
  2. import (
  3. "crypto/ecdsa"
  4. "crypto/ed25519"
  5. "crypto/elliptic"
  6. "crypto/rand"
  7. "crypto/rsa"
  8. "crypto/x509"
  9. "encoding/asn1"
  10. "encoding/pem"
  11. "math/big"
  12. "time"
  13. "github.com/v2fly/v2ray-core/v5/common"
  14. "github.com/v2fly/v2ray-core/v5/common/net"
  15. )
  16. //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen
  17. type Certificate struct {
  18. // Certificate in ASN.1 DER format
  19. Certificate []byte
  20. // Private key in ASN.1 DER format
  21. PrivateKey []byte
  22. }
  23. func ParseCertificate(certPEM []byte, keyPEM []byte) (*Certificate, error) {
  24. certBlock, _ := pem.Decode(certPEM)
  25. if certBlock == nil {
  26. return nil, newError("failed to decode certificate")
  27. }
  28. keyBlock, _ := pem.Decode(keyPEM)
  29. if keyBlock == nil {
  30. return nil, newError("failed to decode key")
  31. }
  32. return &Certificate{
  33. Certificate: certBlock.Bytes,
  34. PrivateKey: keyBlock.Bytes,
  35. }, nil
  36. }
  37. func (c *Certificate) ToPEM() ([]byte, []byte) {
  38. return pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: c.Certificate}),
  39. pem.EncodeToMemory(&pem.Block{Type: "RSA PRIVATE KEY", Bytes: c.PrivateKey})
  40. }
  41. type Option func(*x509.Certificate)
  42. func Authority(isCA bool) Option {
  43. return func(cert *x509.Certificate) {
  44. cert.IsCA = isCA
  45. }
  46. }
  47. func NotBefore(t time.Time) Option {
  48. return func(c *x509.Certificate) {
  49. c.NotBefore = t
  50. }
  51. }
  52. func NotAfter(t time.Time) Option {
  53. return func(c *x509.Certificate) {
  54. c.NotAfter = t
  55. }
  56. }
  57. func DNSNames(names ...string) Option {
  58. return func(c *x509.Certificate) {
  59. c.DNSNames = names
  60. }
  61. }
  62. func CommonName(name string) Option {
  63. return func(c *x509.Certificate) {
  64. c.Subject.CommonName = name
  65. }
  66. }
  67. func IPAddresses(ip ...net.IP) Option {
  68. return func(c *x509.Certificate) {
  69. c.IPAddresses = ip
  70. }
  71. }
  72. func KeyUsage(usage x509.KeyUsage) Option {
  73. return func(c *x509.Certificate) {
  74. c.KeyUsage = usage
  75. }
  76. }
  77. func Organization(org string) Option {
  78. return func(c *x509.Certificate) {
  79. c.Subject.Organization = []string{org}
  80. }
  81. }
  82. func MustGenerate(parent *Certificate, opts ...Option) *Certificate {
  83. cert, err := Generate(parent, opts...)
  84. common.Must(err)
  85. return cert
  86. }
  87. func publicKey(priv interface{}) interface{} {
  88. switch k := priv.(type) {
  89. case *rsa.PrivateKey:
  90. return &k.PublicKey
  91. case *ecdsa.PrivateKey:
  92. return &k.PublicKey
  93. case ed25519.PrivateKey:
  94. return k.Public().(ed25519.PublicKey)
  95. default:
  96. return nil
  97. }
  98. }
  99. func Generate(parent *Certificate, opts ...Option) (*Certificate, error) {
  100. var (
  101. pKey interface{}
  102. parentKey interface{}
  103. err error
  104. )
  105. // higher signing performance than RSA2048
  106. selfKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
  107. if err != nil {
  108. return nil, newError("failed to generate self private key").Base(err)
  109. }
  110. parentKey = selfKey
  111. if parent != nil {
  112. if _, e := asn1.Unmarshal(parent.PrivateKey, &ecPrivateKey{}); e == nil {
  113. pKey, err = x509.ParseECPrivateKey(parent.PrivateKey)
  114. } else if _, e := asn1.Unmarshal(parent.PrivateKey, &pkcs8{}); e == nil {
  115. pKey, err = x509.ParsePKCS8PrivateKey(parent.PrivateKey)
  116. } else if _, e := asn1.Unmarshal(parent.PrivateKey, &pkcs1PrivateKey{}); e == nil {
  117. pKey, err = x509.ParsePKCS1PrivateKey(parent.PrivateKey)
  118. }
  119. if err != nil {
  120. return nil, newError("failed to parse parent private key").Base(err)
  121. }
  122. parentKey = pKey
  123. }
  124. serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)
  125. serialNumber, err := rand.Int(rand.Reader, serialNumberLimit)
  126. if err != nil {
  127. return nil, newError("failed to generate serial number").Base(err)
  128. }
  129. template := &x509.Certificate{
  130. SerialNumber: serialNumber,
  131. NotBefore: time.Now().Add(time.Hour * -1),
  132. NotAfter: time.Now().Add(time.Hour),
  133. KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
  134. ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
  135. BasicConstraintsValid: true,
  136. }
  137. for _, opt := range opts {
  138. opt(template)
  139. }
  140. parentCert := template
  141. if parent != nil {
  142. pCert, err := x509.ParseCertificate(parent.Certificate)
  143. if err != nil {
  144. return nil, newError("failed to parse parent certificate").Base(err)
  145. }
  146. parentCert = pCert
  147. }
  148. derBytes, err := x509.CreateCertificate(rand.Reader, template, parentCert, publicKey(selfKey), parentKey)
  149. if err != nil {
  150. return nil, newError("failed to create certificate").Base(err)
  151. }
  152. privateKey, err := x509.MarshalPKCS8PrivateKey(selfKey)
  153. if err != nil {
  154. return nil, newError("Unable to marshal private key").Base(err)
  155. }
  156. return &Certificate{
  157. Certificate: derBytes,
  158. PrivateKey: privateKey,
  159. }, nil
  160. }