mirror of
https://github.com/yusing/godoxy.git
synced 2026-02-18 00:17:41 +01:00
Compare commits
32 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6bb36e2e83 | ||
|
|
4b57ef1cad | ||
|
|
3850a4a6e7 | ||
|
|
da3c624582 | ||
|
|
157a83bef8 | ||
|
|
d61bd5ce51 | ||
|
|
bad3e9a989 | ||
|
|
9adfd73121 | ||
|
|
4a652aaf55 | ||
|
|
16c986978d | ||
|
|
107b7c5f64 | ||
|
|
818d75c8b7 | ||
|
|
f1bc5de3ea | ||
|
|
425ff0b25c | ||
|
|
1f6614e337 | ||
|
|
9ba102a33d | ||
|
|
31c616246b | ||
|
|
390859bd1f | ||
|
|
243662c13b | ||
|
|
588e9f5b18 | ||
|
|
a3bf88cc9c | ||
|
|
9b1af57859 | ||
|
|
bb7471cc9c | ||
|
|
a403b2b629 | ||
|
|
54b9e7f236 | ||
|
|
45b89cd452 | ||
|
|
72fea96c7b | ||
|
|
aef646be6f | ||
|
|
135a4ff6c7 | ||
|
|
5f418b62c7 | ||
|
|
bd92c46375 | ||
|
|
21a23dd147 |
@@ -4,10 +4,13 @@ import (
|
|||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
||||||
"crypto/elliptic"
|
"crypto/elliptic"
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
|
"crypto/sha256"
|
||||||
"crypto/x509"
|
"crypto/x509"
|
||||||
|
"encoding/hex"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
|
||||||
"github.com/go-acme/lego/v4/certcrypto"
|
"github.com/go-acme/lego/v4/certcrypto"
|
||||||
@@ -27,7 +30,7 @@ type Config struct {
|
|||||||
CertPath string `json:"cert_path,omitempty"`
|
CertPath string `json:"cert_path,omitempty"`
|
||||||
KeyPath string `json:"key_path,omitempty"`
|
KeyPath string `json:"key_path,omitempty"`
|
||||||
Extra []ConfigExtra `json:"extra,omitempty"`
|
Extra []ConfigExtra `json:"extra,omitempty"`
|
||||||
ACMEKeyPath string `json:"acme_key_path,omitempty"` // shared by all extra providers
|
ACMEKeyPath string `json:"acme_key_path,omitempty"` // shared by all extra providers with the same CA directory URL
|
||||||
Provider string `json:"provider,omitempty"`
|
Provider string `json:"provider,omitempty"`
|
||||||
Options map[string]strutils.Redacted `json:"options,omitempty"`
|
Options map[string]strutils.Redacted `json:"options,omitempty"`
|
||||||
|
|
||||||
@@ -88,7 +91,7 @@ func (cfg *Config) validate(seenPaths map[string]int) gperr.Error {
|
|||||||
cfg.KeyPath = KeyFileDefault
|
cfg.KeyPath = KeyFileDefault
|
||||||
}
|
}
|
||||||
if cfg.ACMEKeyPath == "" {
|
if cfg.ACMEKeyPath == "" {
|
||||||
cfg.ACMEKeyPath = ACMEKeyFileDefault
|
cfg.ACMEKeyPath = acmeKeyPath(cfg.CADirURL)
|
||||||
}
|
}
|
||||||
|
|
||||||
b := gperr.NewBuilder("certificate error")
|
b := gperr.NewBuilder("certificate error")
|
||||||
@@ -272,3 +275,16 @@ func (cfg *Config) SaveACMEKey(key *ecdsa.PrivateKey) error {
|
|||||||
}
|
}
|
||||||
return os.WriteFile(cfg.ACMEKeyPath, data, 0o600)
|
return os.WriteFile(cfg.ACMEKeyPath, data, 0o600)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// acmeKeyPath returns the path to the ACME key file based on the CA directory URL.
|
||||||
|
// Different CA directory URLs will use different key files to avoid key conflicts.
|
||||||
|
func acmeKeyPath(caDirURL string) string {
|
||||||
|
// Use a hash of the CA directory URL to create a unique key filename
|
||||||
|
// Default to "acme" if no custom CA is configured (Let's Encrypt default)
|
||||||
|
filename := "acme"
|
||||||
|
if caDirURL != "" {
|
||||||
|
hash := sha256.Sum256([]byte(caDirURL))
|
||||||
|
filename = "acme_" + hex.EncodeToString(hash[:])[:16]
|
||||||
|
}
|
||||||
|
return filepath.Join(certBasePath, filename+".key")
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
package autocert
|
package autocert
|
||||||
|
|
||||||
const (
|
const (
|
||||||
certBasePath = "certs/"
|
certBasePath = "certs/"
|
||||||
CertFileDefault = certBasePath + "cert.crt"
|
CertFileDefault = certBasePath + "cert.crt"
|
||||||
KeyFileDefault = certBasePath + "priv.key"
|
KeyFileDefault = certBasePath + "priv.key"
|
||||||
ACMEKeyFileDefault = certBasePath + "acme.key"
|
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -228,7 +228,7 @@ func (p *Provider) ObtainCertIfNotExistsAll() error {
|
|||||||
|
|
||||||
// obtainCertIfNotExists obtains a new certificate for this provider if it does not exist.
|
// obtainCertIfNotExists obtains a new certificate for this provider if it does not exist.
|
||||||
func (p *Provider) obtainCertIfNotExists() error {
|
func (p *Provider) obtainCertIfNotExists() error {
|
||||||
err := p.LoadCert()
|
err := p.loadCert()
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -346,29 +346,32 @@ func (p *Provider) ObtainCert() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Provider) LoadCert() error {
|
func (p *Provider) LoadCertAll() error {
|
||||||
var errs gperr.Builder
|
var errs gperr.Builder
|
||||||
|
for _, provider := range p.allProviders() {
|
||||||
|
if err := provider.loadCert(); err != nil {
|
||||||
|
errs.Add(provider.fmtError(err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p.rebuildSNIMatcher()
|
||||||
|
return errs.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Provider) loadCert() error {
|
||||||
cert, err := tls.LoadX509KeyPair(p.cfg.CertPath, p.cfg.KeyPath)
|
cert, err := tls.LoadX509KeyPair(p.cfg.CertPath, p.cfg.KeyPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errs.Addf("load SSL certificate: %w", p.fmtError(err))
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
expiries, err := getCertExpiries(&cert)
|
expiries, err := getCertExpiries(&cert)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errs.Addf("parse SSL certificate: %w", p.fmtError(err))
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
p.tlsCert = &cert
|
p.tlsCert = &cert
|
||||||
p.certExpiries = expiries
|
p.certExpiries = expiries
|
||||||
|
|
||||||
for _, ep := range p.extraProviders {
|
return nil
|
||||||
if err := ep.LoadCert(); err != nil {
|
|
||||||
errs.Add(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
p.rebuildSNIMatcher()
|
|
||||||
return errs.Error()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// PrintCertExpiriesAll prints the certificate expiries for this provider and all extra providers.
|
// PrintCertExpiriesAll prints the certificate expiries for this provider and all extra providers.
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ func TestGetCertBySNI(t *testing.T) {
|
|||||||
p, err := autocert.NewProvider(cfg, nil, nil)
|
p, err := autocert.NewProvider(cfg, nil, nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
err = p.LoadCert()
|
err = p.LoadCertAll()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
cert, err := p.GetCert(&tls.ClientHelloInfo{ServerName: "a.internal.example.com"})
|
cert, err := p.GetCert(&tls.ClientHelloInfo{ServerName: "a.internal.example.com"})
|
||||||
@@ -113,7 +113,7 @@ func TestGetCertBySNI(t *testing.T) {
|
|||||||
p, err := autocert.NewProvider(cfg, nil, nil)
|
p, err := autocert.NewProvider(cfg, nil, nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
err = p.LoadCert()
|
err = p.LoadCertAll()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
cert, err := p.GetCert(&tls.ClientHelloInfo{ServerName: "foo.example.com"})
|
cert, err := p.GetCert(&tls.ClientHelloInfo{ServerName: "foo.example.com"})
|
||||||
@@ -145,7 +145,7 @@ func TestGetCertBySNI(t *testing.T) {
|
|||||||
p, err := autocert.NewProvider(cfg, nil, nil)
|
p, err := autocert.NewProvider(cfg, nil, nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
err = p.LoadCert()
|
err = p.LoadCertAll()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
cert, err := p.GetCert(&tls.ClientHelloInfo{ServerName: "unknown.domain.com"})
|
cert, err := p.GetCert(&tls.ClientHelloInfo{ServerName: "unknown.domain.com"})
|
||||||
@@ -171,7 +171,7 @@ func TestGetCertBySNI(t *testing.T) {
|
|||||||
p, err := autocert.NewProvider(cfg, nil, nil)
|
p, err := autocert.NewProvider(cfg, nil, nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
err = p.LoadCert()
|
err = p.LoadCertAll()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
cert, err := p.GetCert(nil)
|
cert, err := p.GetCert(nil)
|
||||||
@@ -197,7 +197,7 @@ func TestGetCertBySNI(t *testing.T) {
|
|||||||
p, err := autocert.NewProvider(cfg, nil, nil)
|
p, err := autocert.NewProvider(cfg, nil, nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
err = p.LoadCert()
|
err = p.LoadCertAll()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
cert, err := p.GetCert(&tls.ClientHelloInfo{ServerName: ""})
|
cert, err := p.GetCert(&tls.ClientHelloInfo{ServerName: ""})
|
||||||
@@ -229,7 +229,7 @@ func TestGetCertBySNI(t *testing.T) {
|
|||||||
p, err := autocert.NewProvider(cfg, nil, nil)
|
p, err := autocert.NewProvider(cfg, nil, nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
err = p.LoadCert()
|
err = p.LoadCertAll()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
cert, err := p.GetCert(&tls.ClientHelloInfo{ServerName: "FOO.EXAMPLE.COM"})
|
cert, err := p.GetCert(&tls.ClientHelloInfo{ServerName: "FOO.EXAMPLE.COM"})
|
||||||
@@ -261,7 +261,7 @@ func TestGetCertBySNI(t *testing.T) {
|
|||||||
p, err := autocert.NewProvider(cfg, nil, nil)
|
p, err := autocert.NewProvider(cfg, nil, nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
err = p.LoadCert()
|
err = p.LoadCertAll()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
cert, err := p.GetCert(&tls.ClientHelloInfo{ServerName: " foo.example.com. "})
|
cert, err := p.GetCert(&tls.ClientHelloInfo{ServerName: " foo.example.com. "})
|
||||||
@@ -293,7 +293,7 @@ func TestGetCertBySNI(t *testing.T) {
|
|||||||
p, err := autocert.NewProvider(cfg, nil, nil)
|
p, err := autocert.NewProvider(cfg, nil, nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
err = p.LoadCert()
|
err = p.LoadCertAll()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
cert, err := p.GetCert(&tls.ClientHelloInfo{ServerName: "foo.a.example.com"})
|
cert, err := p.GetCert(&tls.ClientHelloInfo{ServerName: "foo.a.example.com"})
|
||||||
@@ -319,7 +319,7 @@ func TestGetCertBySNI(t *testing.T) {
|
|||||||
p, err := autocert.NewProvider(cfg, nil, nil)
|
p, err := autocert.NewProvider(cfg, nil, nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
err = p.LoadCert()
|
err = p.LoadCertAll()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
cert, err := p.GetCert(&tls.ClientHelloInfo{ServerName: "bar.example.com"})
|
cert, err := p.GetCert(&tls.ClientHelloInfo{ServerName: "bar.example.com"})
|
||||||
@@ -355,7 +355,7 @@ func TestGetCertBySNI(t *testing.T) {
|
|||||||
p, err := autocert.NewProvider(cfg, nil, nil)
|
p, err := autocert.NewProvider(cfg, nil, nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
err = p.LoadCert()
|
err = p.LoadCertAll()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
cert1, err := p.GetCert(&tls.ClientHelloInfo{ServerName: "foo.test.com"})
|
cert1, err := p.GetCert(&tls.ClientHelloInfo{ServerName: "foo.test.com"})
|
||||||
@@ -392,7 +392,7 @@ func TestGetCertBySNI(t *testing.T) {
|
|||||||
p, err := autocert.NewProvider(cfg, nil, nil)
|
p, err := autocert.NewProvider(cfg, nil, nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
err = p.LoadCert()
|
err = p.LoadCertAll()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
cert1, err := p.GetCert(&tls.ClientHelloInfo{ServerName: "foo.example.com"})
|
cert1, err := p.GetCert(&tls.ClientHelloInfo{ServerName: "foo.example.com"})
|
||||||
|
|||||||
Reference in New Issue
Block a user