59 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Package certmagic is the ACME provider from github.com/mholt/certmagic
 | 
						|
package certmagic
 | 
						|
 | 
						|
import (
 | 
						|
	"log"
 | 
						|
	"math/rand"
 | 
						|
	"net"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"github.com/mholt/certmagic"
 | 
						|
 | 
						|
	"github.com/micro/go-micro/api/server/acme"
 | 
						|
)
 | 
						|
 | 
						|
type certmagicProvider struct {
 | 
						|
	opts acme.Options
 | 
						|
}
 | 
						|
 | 
						|
func (c *certmagicProvider) NewListener(ACMEHosts ...string) (net.Listener, error) {
 | 
						|
	certmagic.Default.CA = c.opts.CA
 | 
						|
	if c.opts.ChallengeProvider != nil {
 | 
						|
		// Enabling DNS Challenge disables the other challenges
 | 
						|
		certmagic.Default.DNSProvider = c.opts.ChallengeProvider
 | 
						|
	}
 | 
						|
	if c.opts.OnDemand {
 | 
						|
		certmagic.Default.OnDemand = new(certmagic.OnDemandConfig)
 | 
						|
	}
 | 
						|
	if c.opts.Cache != nil {
 | 
						|
		// already validated by new()
 | 
						|
		certmagic.Default.Storage = c.opts.Cache.(certmagic.Storage)
 | 
						|
	}
 | 
						|
	// If multiple instances of the provider are running, inject some
 | 
						|
	// randomness so they don't collide
 | 
						|
	rand.Seed(time.Now().UnixNano())
 | 
						|
	randomDuration := (7 * 24 * time.Hour) + (time.Duration(rand.Intn(504)) * time.Hour)
 | 
						|
	certmagic.Default.RenewDurationBefore = randomDuration
 | 
						|
 | 
						|
	return certmagic.Listen(ACMEHosts)
 | 
						|
}
 | 
						|
 | 
						|
// New returns a certmagic provider
 | 
						|
func New(options ...acme.Option) acme.Provider {
 | 
						|
	opts := acme.DefaultOptions()
 | 
						|
 | 
						|
	for _, o := range options {
 | 
						|
		o(&opts)
 | 
						|
	}
 | 
						|
 | 
						|
	if opts.Cache != nil {
 | 
						|
		if _, ok := opts.Cache.(certmagic.Storage); !ok {
 | 
						|
			log.Fatal("ACME: cache provided doesn't implement certmagic's Storage interface")
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return &certmagicProvider{
 | 
						|
		opts: opts,
 | 
						|
	}
 | 
						|
}
 |