cert.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  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/xtls/xray-core/common"
  14. "github.com/xtls/xray-core/common/errors"
  15. )
  16. //go:generate go run github.com/xtls/xray-core/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, errors.New("failed to decode certificate")
  27. }
  28. keyBlock, _ := pem.Decode(keyPEM)
  29. if keyBlock == nil {
  30. return nil, errors.New("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 KeyUsage(usage x509.KeyUsage) Option {
  68. return func(c *x509.Certificate) {
  69. c.KeyUsage = usage
  70. }
  71. }
  72. func Organization(org string) Option {
  73. return func(c *x509.Certificate) {
  74. c.Subject.Organization = []string{org}
  75. }
  76. }
  77. func MustGenerate(parent *Certificate, opts ...Option) *Certificate {
  78. cert, err := Generate(parent, opts...)
  79. common.Must(err)
  80. return cert
  81. }
  82. func publicKey(priv interface{}) interface{} {
  83. switch k := priv.(type) {
  84. case *rsa.PrivateKey:
  85. return &k.PublicKey
  86. case *ecdsa.PrivateKey:
  87. return &k.PublicKey
  88. case ed25519.PrivateKey:
  89. return k.Public().(ed25519.PublicKey)
  90. default:
  91. return nil
  92. }
  93. }
  94. func Generate(parent *Certificate, opts ...Option) (*Certificate, error) {
  95. var (
  96. pKey interface{}
  97. parentKey interface{}
  98. err error
  99. )
  100. // higher signing performance than RSA2048
  101. selfKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
  102. if err != nil {
  103. return nil, errors.New("failed to generate self private key").Base(err)
  104. }
  105. parentKey = selfKey
  106. if parent != nil {
  107. if _, e := asn1.Unmarshal(parent.PrivateKey, &ecPrivateKey{}); e == nil {
  108. pKey, err = x509.ParseECPrivateKey(parent.PrivateKey)
  109. } else if _, e := asn1.Unmarshal(parent.PrivateKey, &pkcs8{}); e == nil {
  110. pKey, err = x509.ParsePKCS8PrivateKey(parent.PrivateKey)
  111. } else if _, e := asn1.Unmarshal(parent.PrivateKey, &pkcs1PrivateKey{}); e == nil {
  112. pKey, err = x509.ParsePKCS1PrivateKey(parent.PrivateKey)
  113. }
  114. if err != nil {
  115. return nil, errors.New("failed to parse parent private key").Base(err)
  116. }
  117. parentKey = pKey
  118. }
  119. serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)
  120. serialNumber, err := rand.Int(rand.Reader, serialNumberLimit)
  121. if err != nil {
  122. return nil, errors.New("failed to generate serial number").Base(err)
  123. }
  124. template := &x509.Certificate{
  125. SerialNumber: serialNumber,
  126. NotBefore: time.Now().Add(time.Hour * -1),
  127. NotAfter: time.Now().Add(time.Hour),
  128. KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
  129. ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
  130. BasicConstraintsValid: true,
  131. }
  132. for _, opt := range opts {
  133. opt(template)
  134. }
  135. parentCert := template
  136. if parent != nil {
  137. pCert, err := x509.ParseCertificate(parent.Certificate)
  138. if err != nil {
  139. return nil, errors.New("failed to parse parent certificate").Base(err)
  140. }
  141. parentCert = pCert
  142. }
  143. derBytes, err := x509.CreateCertificate(rand.Reader, template, parentCert, publicKey(selfKey), parentKey)
  144. if err != nil {
  145. return nil, errors.New("failed to create certificate").Base(err)
  146. }
  147. privateKey, err := x509.MarshalPKCS8PrivateKey(selfKey)
  148. if err != nil {
  149. return nil, errors.New("Unable to marshal private key").Base(err)
  150. }
  151. return &Certificate{
  152. Certificate: derBytes,
  153. PrivateKey: privateKey,
  154. }, nil
  155. }