|  | @@ -5,7 +5,6 @@ import (
 | 
	
		
			
				|  |  |  	"crypto/ecdsa"
 | 
	
		
			
				|  |  |  	"crypto/elliptic"
 | 
	
		
			
				|  |  |  	"crypto/rand"
 | 
	
		
			
				|  |  | -	"crypto/tls"
 | 
	
		
			
				|  |  |  	"crypto/x509"
 | 
	
		
			
				|  |  |  	"github.com/0xJacky/Nginx-UI/server/model"
 | 
	
		
			
				|  |  |  	"github.com/0xJacky/Nginx-UI/server/settings"
 | 
	
	
		
			
				|  | @@ -15,9 +14,11 @@ import (
 | 
	
		
			
				|  |  |  	"github.com/go-acme/lego/v4/challenge/http01"
 | 
	
		
			
				|  |  |  	"github.com/go-acme/lego/v4/lego"
 | 
	
		
			
				|  |  |  	"github.com/go-acme/lego/v4/registration"
 | 
	
		
			
				|  |  | +	"github.com/pkg/errors"
 | 
	
		
			
				|  |  |  	"io"
 | 
	
		
			
				|  |  |  	"io/ioutil"
 | 
	
		
			
				|  |  |  	"log"
 | 
	
		
			
				|  |  | +	"net"
 | 
	
		
			
				|  |  |  	"net/http"
 | 
	
		
			
				|  |  |  	"os"
 | 
	
		
			
				|  |  |  	"path/filepath"
 | 
	
	
		
			
				|  | @@ -70,15 +71,20 @@ func GetCertInfo(domain string) (key *x509.Certificate, err error) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	var response *http.Response
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	ts := &http.Transport{
 | 
	
		
			
				|  |  | -		TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
 | 
	
		
			
				|  |  | +	client := &http.Client{
 | 
	
		
			
				|  |  | +		Transport: &http.Transport{
 | 
	
		
			
				|  |  | +			DialContext: (&net.Dialer{
 | 
	
		
			
				|  |  | +				Timeout: 5 * time.Second,
 | 
	
		
			
				|  |  | +			}).DialContext,
 | 
	
		
			
				|  |  | +			DisableKeepAlives: true,
 | 
	
		
			
				|  |  | +		},
 | 
	
		
			
				|  |  | +		Timeout: 5 * time.Second,
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	client := &http.Client{Transport: ts}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  	response, err = client.Get("https://" + domain)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  | +		err = errors.Wrap(err, "get cert info error")
 | 
	
		
			
				|  |  |  		return
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -99,8 +105,7 @@ func IssueCert(domain string) error {
 | 
	
		
			
				|  |  |  	// Create a user. New accounts need an email and private key to start.
 | 
	
		
			
				|  |  |  	privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  | -		log.Println(err)
 | 
	
		
			
				|  |  | -		return err
 | 
	
		
			
				|  |  | +		return errors.Wrap(err, "issue cert generate key error")
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	myUser := MyUser{
 | 
	
	
		
			
				|  | @@ -118,8 +123,7 @@ func IssueCert(domain string) error {
 | 
	
		
			
				|  |  |  	// A client facilitates communication with the CA server.
 | 
	
		
			
				|  |  |  	client, err := lego.NewClient(config)
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  | -		log.Println(err)
 | 
	
		
			
				|  |  | -		return err
 | 
	
		
			
				|  |  | +		return errors.Wrap(err, "issue cert new client error")
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	err = client.Challenge.SetHTTP01Provider(
 | 
	
	
		
			
				|  | @@ -128,15 +132,14 @@ func IssueCert(domain string) error {
 | 
	
		
			
				|  |  |  		),
 | 
	
		
			
				|  |  |  	)
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  | -		log.Println(err)
 | 
	
		
			
				|  |  | -		return err
 | 
	
		
			
				|  |  | +		return errors.Wrap(err, "issue cert challenge fail")
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	// New users will need to register
 | 
	
		
			
				|  |  |  	reg, err := client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed: true})
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  |  		log.Println(err)
 | 
	
		
			
				|  |  | -		return err
 | 
	
		
			
				|  |  | +		return errors.Wrap(err, "issue cert register fail")
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	myUser.Registration = reg
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -146,15 +149,13 @@ func IssueCert(domain string) error {
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	certificates, err := client.Certificate.Obtain(request)
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  | -		log.Println(err)
 | 
	
		
			
				|  |  | -		return err
 | 
	
		
			
				|  |  | +		return errors.Wrap(err, "issue cert fail to obtain")
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	saveDir := nginx.GetNginxConfPath("ssl/" + domain)
 | 
	
		
			
				|  |  |  	if _, err := os.Stat(saveDir); os.IsNotExist(err) {
 | 
	
		
			
				|  |  |  		err = os.Mkdir(saveDir, 0755)
 | 
	
		
			
				|  |  |  		if err != nil {
 | 
	
		
			
				|  |  | -			log.Println("fail to create", saveDir)
 | 
	
		
			
				|  |  | -			return err
 | 
	
		
			
				|  |  | +			return errors.Wrap(err, "issue cert fail to create")
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -164,13 +165,13 @@ func IssueCert(domain string) error {
 | 
	
		
			
				|  |  |  		certificates.Certificate, 0644)
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  |  		log.Println(err)
 | 
	
		
			
				|  |  | -		return err
 | 
	
		
			
				|  |  | +		return errors.Wrap(err, "issue cert write fullchain.cer fail")
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	err = ioutil.WriteFile(filepath.Join(saveDir, domain+".key"),
 | 
	
		
			
				|  |  |  		certificates.PrivateKey, 0644)
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  |  		log.Println(err)
 | 
	
		
			
				|  |  | -		return err
 | 
	
		
			
				|  |  | +		return errors.Wrap(err, "issue cert write key fail")
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	nginx.ReloadNginx()
 |