Skip to content

Commit

Permalink
feat: support not-only Let's Encrypt service? #16
Browse files Browse the repository at this point in the history
  • Loading branch information
0xJacky committed Apr 30, 2024
1 parent 3e90b83 commit f3f62bc
Show file tree
Hide file tree
Showing 6 changed files with 60 additions and 57 deletions.
5 changes: 2 additions & 3 deletions app/src/views/certificate/ACMEUserSelector.vue
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,8 @@ const mounted = ref(false)
watch(id, init)
watch(current, () => {
data.value.acme_user_id = current.value.id
if (!mounted.value)
data.value.acme_user_id = 0
if (mounted.value)
data.value.acme_user_id = current.value.id
})
onMounted(async () => {
Expand Down
37 changes: 8 additions & 29 deletions internal/cert/cert.go
Original file line number Diff line number Diff line change
@@ -1,22 +1,17 @@
package cert

import (
"crypto/ecdsa"
"crypto/elliptic"
"crypto/rand"
"crypto/tls"
"github.com/0xJacky/Nginx-UI/internal/cert/dns"
"github.com/0xJacky/Nginx-UI/internal/logger"
"github.com/0xJacky/Nginx-UI/internal/nginx"
"github.com/0xJacky/Nginx-UI/model"
"github.com/0xJacky/Nginx-UI/query"
"github.com/0xJacky/Nginx-UI/settings"
"github.com/go-acme/lego/v4/certificate"
"github.com/go-acme/lego/v4/challenge/http01"
"github.com/go-acme/lego/v4/lego"
legolog "github.com/go-acme/lego/v4/log"
dnsproviders "github.com/go-acme/lego/v4/providers/dns"
"github.com/go-acme/lego/v4/registration"
"github.com/pkg/errors"
"log"
"net/http"
Expand Down Expand Up @@ -51,22 +46,13 @@ func IssueCert(payload *ConfigPayload, logChan chan string, errChan chan error)

domain := payload.ServerName

// Create a user. New accounts need an email and private key to start.
l.Println("[INFO] [Nginx UI] Generating private key for registering account")
privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
l.Println("[INFO] [Nginx UI] Preparing lego configurations")
user, err := payload.GetACMEUser()
if err != nil {
errChan <- errors.Wrap(err, "issue cert generate key error")
errChan <- errors.Wrap(err, "issue cert get acme user error")
return
}

l.Println("[INFO] [Nginx UI] Preparing lego configurations")
user := newUser(settings.ServerSettings.Email)

user.Key = model.PrivateKey{
X: privateKey.PublicKey.X,
Y: privateKey.PublicKey.Y,
D: privateKey.D,
}
l.Printf("[INFO] [Nginx UI] ACME User: %s, CA Dir: %s\n", user.Email, user.CADir)

// Start a goroutine to fetch and process logs from channel
go func() {
Expand All @@ -77,14 +63,16 @@ func IssueCert(payload *ConfigPayload, logChan chan string, errChan chan error)

config := lego.NewConfig(user)

config.CADirURL = settings.ServerSettings.GetCADir()
config.CADirURL = user.CADir

// Skip TLS check
if config.HTTPClient != nil {
config.HTTPClient.Transport = &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
}

config.Certificate.KeyType = payload.KeyType
config.Certificate.KeyType = payload.GetKeyType()

l.Println("[INFO] [Nginx UI] Creating client facilitates communication with the CA server")
// A client facilitates communication with the CA server.
Expand Down Expand Up @@ -146,15 +134,6 @@ func IssueCert(payload *ConfigPayload, logChan chan string, errChan chan error)
return
}

// New users will need to register
l.Println("[INFO] [Nginx UI] Registering user")
reg, err := client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed: true})
if err != nil {
errChan <- errors.Wrap(err, "register error")
return
}
user.Registration = *reg

request := certificate.ObtainRequest{
Domains: domain,
Bundle: true,
Expand Down
20 changes: 20 additions & 0 deletions internal/cert/payload.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,36 @@ package cert

import (
"github.com/0xJacky/Nginx-UI/internal/helper"
"github.com/0xJacky/Nginx-UI/internal/logger"
"github.com/0xJacky/Nginx-UI/model"
"github.com/0xJacky/Nginx-UI/query"
"github.com/go-acme/lego/v4/certcrypto"
)

type ConfigPayload struct {
ServerName []string `json:"server_name"`
ChallengeMethod string `json:"challenge_method"`
DNSCredentialID int `json:"dns_credential_id"`
ACMEUserID int `json:"acme_user_id"`
KeyType certcrypto.KeyType `json:"key_type"`
}

func (c *ConfigPayload) GetACMEUser() (user *model.AcmeUser, err error) {
u := query.AcmeUser
// if acme_user_id == 0, use default user
if c.ACMEUserID == 0 {
return GetDefaultACMEUser()
}
// use the acme_user_id to get the acme user
user, err = u.Where(u.ID.Eq(c.ACMEUserID)).First()
// if acme_user not exist, use default user
if err != nil {
logger.Error(err)
return GetDefaultACMEUser()
}
return
}

func (c *ConfigPayload) GetKeyType() certcrypto.KeyType {
return helper.GetKeyType(c.KeyType)
}
25 changes: 18 additions & 7 deletions internal/cert/register.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,10 @@ func InitRegister() {
}

// Create a new user
user := &User{
AcmeUser: model.AcmeUser{
Name: "System Initial User",
Email: settings.ServerSettings.Email,
CADir: settings.ServerSettings.GetCADir(),
},
user := &model.AcmeUser{
Name: "System Initial User",
Email: settings.ServerSettings.Email,
CADir: settings.ServerSettings.GetCADir(),
}

err = user.Register()
Expand All @@ -43,11 +41,24 @@ func InitRegister() {
return
}

err = u.Create(&user.AcmeUser)
err = u.Create(user)
if err != nil {
logger.Error(err)
return
}

logger.Info("ACME Default User registered")
}

func GetDefaultACMEUser() (user *model.AcmeUser, err error) {
u := query.AcmeUser
user, err = u.Where(u.Email.Eq(settings.ServerSettings.Email),
u.CADir.Eq(settings.ServerSettings.GetCADir())).First()

if err != nil {
err = errors.Wrap(err, "get default user error")
return
}

return
}
18 changes: 0 additions & 18 deletions internal/cert/user.go

This file was deleted.

12 changes: 12 additions & 0 deletions model/acme_user.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@ import (
"crypto/ecdsa"
"crypto/elliptic"
"crypto/rand"
"crypto/tls"
"github.com/go-acme/lego/v4/lego"
"github.com/go-acme/lego/v4/registration"
"math/big"
"net/http"
)

type PrivateKey struct {
Expand Down Expand Up @@ -55,6 +57,16 @@ func (u *AcmeUser) Register() error {
}

config := lego.NewConfig(u)
config.CADirURL = u.CADir
u.Registration = registration.Resource{}

// Skip TLS check
if config.HTTPClient != nil {
config.HTTPClient.Transport = &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
}

client, err := lego.NewClient(config)
if err != nil {
return err
Expand Down

0 comments on commit f3f62bc

Please sign in to comment.