acme_user.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package model
  2. import (
  3. "crypto"
  4. "crypto/ecdsa"
  5. "crypto/elliptic"
  6. "crypto/rand"
  7. "github.com/0xJacky/Nginx-UI/internal/transport"
  8. "github.com/go-acme/lego/v4/lego"
  9. "github.com/go-acme/lego/v4/registration"
  10. "math/big"
  11. )
  12. type PrivateKey struct {
  13. X, Y *big.Int
  14. D *big.Int
  15. }
  16. type AcmeUser struct {
  17. Model
  18. Name string `json:"name"`
  19. Email string `json:"email"`
  20. CADir string `json:"ca_dir"`
  21. Registration registration.Resource `json:"registration" gorm:"serializer:json"`
  22. Key PrivateKey `json:"-" gorm:"serializer:json"`
  23. }
  24. func (u *AcmeUser) GetEmail() string {
  25. return u.Email
  26. }
  27. func (u *AcmeUser) GetRegistration() *registration.Resource {
  28. return &u.Registration
  29. }
  30. func (u *AcmeUser) GetPrivateKey() crypto.PrivateKey {
  31. return &ecdsa.PrivateKey{
  32. PublicKey: ecdsa.PublicKey{
  33. Curve: elliptic.P256(),
  34. X: u.Key.X,
  35. Y: u.Key.Y,
  36. },
  37. D: u.Key.D,
  38. }
  39. }
  40. func (u *AcmeUser) Register() error {
  41. privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
  42. if err != nil {
  43. return err
  44. }
  45. u.Key = PrivateKey{
  46. X: privateKey.PublicKey.X,
  47. Y: privateKey.PublicKey.Y,
  48. D: privateKey.D,
  49. }
  50. config := lego.NewConfig(u)
  51. config.CADirURL = u.CADir
  52. u.Registration = registration.Resource{}
  53. // Skip TLS check
  54. if config.HTTPClient != nil {
  55. t, err := transport.NewTransport()
  56. if err != nil {
  57. return err
  58. }
  59. config.HTTPClient.Transport = t
  60. }
  61. client, err := lego.NewClient(config)
  62. if err != nil {
  63. return err
  64. }
  65. // New users will need to register
  66. reg, err := client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed: true})
  67. if err != nil {
  68. return err
  69. }
  70. u.Registration = *reg
  71. return nil
  72. }