mirror of
https://github.com/mjl-/mox.git
synced 2025-07-12 17:44:35 +03:00
implement ACME external account binding (EAB)
where a new acme account is created with a reference to an existing non-acme account known by the acme provider. some acme providers require this.
This commit is contained in:
@ -69,12 +69,15 @@ type Manager struct {
|
||||
// contactEmail must be a valid email address to which notifications about ACME can
|
||||
// be sent. directoryURL is the ACME starting point.
|
||||
//
|
||||
// eabKeyID and eabKey are for external account binding when making a new account,
|
||||
// which some ACME providers require.
|
||||
//
|
||||
// getPrivateKey is called to get the private key for the host and key type. It
|
||||
// can be used to deliver a specific (e.g. always the same) private key for a
|
||||
// host, or a newly generated key.
|
||||
//
|
||||
// When shutdown is closed, no new TLS connections can be created.
|
||||
func Load(name, acmeDir, contactEmail, directoryURL string, getPrivateKey func(host string, keyType autocert.KeyType) (crypto.Signer, error), shutdown <-chan struct{}) (*Manager, error) {
|
||||
func Load(name, acmeDir, contactEmail, directoryURL string, eabKeyID string, eabKey []byte, getPrivateKey func(host string, keyType autocert.KeyType) (crypto.Signer, error), shutdown <-chan struct{}) (*Manager, error) {
|
||||
if directoryURL == "" {
|
||||
return nil, fmt.Errorf("empty ACME directory URL")
|
||||
}
|
||||
@ -146,6 +149,14 @@ func Load(name, acmeDir, contactEmail, directoryURL string, getPrivateKey func(h
|
||||
GetPrivateKey: getPrivateKey,
|
||||
// HostPolicy set below.
|
||||
}
|
||||
// If external account binding key is provided, use it for registering a new account.
|
||||
// todo: ideally the key and its id are provided temporarily by the admin when registering a new account. but we don't do that interactive setup yet. in the future, an interactive setup/quickstart would ask for the key once to register a new acme account.
|
||||
if eabKeyID != "" {
|
||||
m.ExternalAccountBinding = &acme.ExternalAccountBinding{
|
||||
KID: eabKeyID,
|
||||
Key: eabKey,
|
||||
}
|
||||
}
|
||||
|
||||
loggingGetCertificate := func(hello *tls.ClientHelloInfo) (*tls.Certificate, error) {
|
||||
log := mlog.New("autotls", nil).WithContext(hello.Context())
|
||||
|
@ -25,7 +25,7 @@ func TestAutotls(t *testing.T) {
|
||||
getPrivateKey := func(host string, keyType autocert.KeyType) (crypto.Signer, error) {
|
||||
return nil, fmt.Errorf("not used")
|
||||
}
|
||||
m, err := Load("test", "../testdata/autotls", "mox@localhost", "https://localhost/", getPrivateKey, shutdown)
|
||||
m, err := Load("test", "../testdata/autotls", "mox@localhost", "https://localhost/", "", nil, getPrivateKey, shutdown)
|
||||
if err != nil {
|
||||
t.Fatalf("load manager: %v", err)
|
||||
}
|
||||
@ -82,7 +82,7 @@ func TestAutotls(t *testing.T) {
|
||||
|
||||
key0 := m.Manager.Client.Key
|
||||
|
||||
m, err = Load("test", "../testdata/autotls", "mox@localhost", "https://localhost/", getPrivateKey, shutdown)
|
||||
m, err = Load("test", "../testdata/autotls", "mox@localhost", "https://localhost/", "", nil, getPrivateKey, shutdown)
|
||||
if err != nil {
|
||||
t.Fatalf("load manager again: %v", err)
|
||||
}
|
||||
@ -95,7 +95,7 @@ func TestAutotls(t *testing.T) {
|
||||
t.Fatalf("hostpolicy, got err %v, expected no error", err)
|
||||
}
|
||||
|
||||
m2, err := Load("test2", "../testdata/autotls", "mox@localhost", "https://localhost/", nil, shutdown)
|
||||
m2, err := Load("test2", "../testdata/autotls", "mox@localhost", "https://localhost/", "", nil, nil, shutdown)
|
||||
if err != nil {
|
||||
t.Fatalf("load another manager: %v", err)
|
||||
}
|
||||
|
Reference in New Issue
Block a user