sing-box/common/tls/acme.go

87 lines
2.4 KiB
Go
Raw Normal View History

//go:build with_acme
2022-09-09 18:45:10 +08:00
package tls
import (
"context"
"crypto/tls"
2022-12-06 13:36:42 +08:00
"os"
"strings"
"github.com/sagernet/sing-box/adapter"
"github.com/sagernet/sing-box/option"
E "github.com/sagernet/sing/common/exceptions"
2022-08-24 17:04:15 +08:00
2022-09-13 16:18:39 +08:00
"github.com/caddyserver/certmagic"
2022-08-24 17:04:15 +08:00
"github.com/mholt/acmez/acme"
2022-12-06 13:36:42 +08:00
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
type acmeWrapper struct {
ctx context.Context
cfg *certmagic.Config
domain []string
}
func (w *acmeWrapper) Start() error {
return w.cfg.ManageSync(w.ctx, w.domain)
}
func (w *acmeWrapper) Close() error {
w.cfg.Unmanage(w.domain)
return nil
}
2022-08-21 19:36:08 +08:00
func startACME(ctx context.Context, options option.InboundACMEOptions) (*tls.Config, adapter.Service, error) {
var acmeServer string
switch options.Provider {
case "", "letsencrypt":
acmeServer = certmagic.LetsEncryptProductionCA
case "zerossl":
acmeServer = certmagic.ZeroSSLProductionCA
default:
if !strings.HasPrefix(options.Provider, "https://") {
return nil, nil, E.New("unsupported acme provider: " + options.Provider)
}
acmeServer = options.Provider
}
var storage certmagic.Storage
if options.DataDirectory != "" {
storage = &certmagic.FileStorage{
Path: options.DataDirectory,
}
2022-08-19 18:05:26 +08:00
} else {
storage = certmagic.Default.Storage
}
2022-08-19 18:05:26 +08:00
config := &certmagic.Config{
DefaultServerName: options.DefaultServerName,
2022-08-19 18:05:26 +08:00
Storage: storage,
2022-12-06 13:36:42 +08:00
Logger: zap.New(zapcore.NewCore(
zapcore.NewConsoleEncoder(zap.NewProductionEncoderConfig()),
os.Stderr,
zap.InfoLevel,
)),
2022-08-19 18:05:26 +08:00
}
2022-08-24 17:04:15 +08:00
acmeConfig := certmagic.ACMEIssuer{
CA: acmeServer,
Email: options.Email,
Agreed: true,
DisableHTTPChallenge: options.DisableHTTPChallenge,
DisableTLSALPNChallenge: options.DisableTLSALPNChallenge,
AltHTTPPort: int(options.AlternativeHTTPPort),
AltTLSALPNPort: int(options.AlternativeTLSPort),
2022-12-06 13:36:42 +08:00
Logger: config.Logger,
2022-08-24 17:04:15 +08:00
}
2022-12-06 13:36:42 +08:00
if options.ExternalAccount != nil && options.ExternalAccount.KeyID != "" {
2022-08-24 17:04:15 +08:00
acmeConfig.ExternalAccount = (*acme.EAB)(options.ExternalAccount)
2022-08-19 18:05:26 +08:00
}
2022-08-24 17:04:15 +08:00
config.Issuers = []certmagic.Issuer{certmagic.NewACMEIssuer(config, acmeConfig)}
2022-08-19 18:05:26 +08:00
config = certmagic.New(certmagic.NewCache(certmagic.CacheOptions{
GetConfigForCert: func(certificate certmagic.Certificate) (*certmagic.Config, error) {
return config, nil
},
2022-08-19 18:05:26 +08:00
}), *config)
return config.TLSConfig(), &acmeWrapper{ctx, config, options.Domain}, nil
}