main.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package applycert
  2. import (
  3. "crypto"
  4. "fmt"
  5. "github.com/SongZihuan/Http-Demo/src/certssl/account"
  6. "github.com/SongZihuan/Http-Demo/src/utils"
  7. "github.com/go-acme/lego/v4/certcrypto"
  8. "github.com/go-acme/lego/v4/certificate"
  9. "github.com/go-acme/lego/v4/lego"
  10. "github.com/go-acme/lego/v4/providers/dns/alidns"
  11. "path"
  12. "time"
  13. )
  14. func ApplyCert(basedir string, email string, aliyunAccessKey string, aliyunAccessSecret string, domain string) (crypto.PrivateKey, *certificate.Resource, error) {
  15. if domain == "" || !utils.IsValidDomain(domain) {
  16. return nil, nil, fmt.Errorf("domain is invalid")
  17. }
  18. privateKey, err := certcrypto.GeneratePrivateKey(certcrypto.RSA4096)
  19. if err != nil {
  20. return nil, nil, fmt.Errorf("generate private key failed: %s", err.Error())
  21. }
  22. user := newUser(email, privateKey)
  23. config := lego.NewConfig(user)
  24. config.Certificate.KeyType = certcrypto.RSA4096
  25. config.Certificate.Timeout = 30 * 24 * time.Hour
  26. config.CADirURL = "https://acme-v02.api.letsencrypt.org/directory"
  27. client, err := lego.NewClient(config)
  28. if err != nil {
  29. return nil, nil, fmt.Errorf("new client failed: %s", err.Error())
  30. }
  31. aliyunDnsConfig := alidns.NewDefaultConfig()
  32. if aliyunAccessKey != "" {
  33. aliyunDnsConfig.APIKey = aliyunAccessKey
  34. }
  35. if aliyunAccessSecret == "" {
  36. aliyunDnsConfig.SecretKey = aliyunAccessSecret
  37. }
  38. provider, err := alidns.NewDNSProviderConfig(aliyunDnsConfig)
  39. if err != nil {
  40. return nil, nil, fmt.Errorf("failed to initialize AliDNS provider: %d", err.Error())
  41. }
  42. err = client.Challenge.SetDNS01Provider(provider)
  43. if err != nil {
  44. return nil, nil, fmt.Errorf("set challenge dns1 provider failed: %s", err.Error())
  45. }
  46. reg, err := account.GetAccount(path.Join(basedir, "account"), user.GetEmail(), client)
  47. if err != nil {
  48. return nil, nil, fmt.Errorf("get account failed: %s", err.Error())
  49. } else if reg == nil {
  50. return nil, nil, fmt.Errorf("get account failed: return nil account.resurce, unknown reason")
  51. }
  52. user.setRegistration(reg)
  53. request := certificate.ObtainRequest{
  54. Domains: []string{domain},
  55. Bundle: true,
  56. }
  57. resource, err := client.Certificate.Obtain(request)
  58. if err != nil {
  59. return nil, nil, fmt.Errorf("obtain certificate failed: %s", err.Error())
  60. }
  61. err = writerWithDate(path.Join(basedir, "cert-backup"), resource)
  62. if err != nil {
  63. return nil, nil, fmt.Errorf("writer certificate backup failed: %s", err.Error())
  64. }
  65. err = writer(basedir, resource)
  66. if err != nil {
  67. return nil, nil, fmt.Errorf("writer certificate failed: %s", err.Error())
  68. }
  69. return privateKey, resource, nil
  70. }