Skip to content

Commit de0df97

Browse files
committed
Add support in tlsalpn provider
1 parent 5309410 commit de0df97

File tree

4 files changed

+84
-9
lines changed

4 files changed

+84
-9
lines changed

challenge/tlsalpn01/tls_alpn_challenge_server.go

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,14 @@ import (
1111
"github.com/go-acme/lego/v4/log"
1212
)
1313

14+
type ProviderNetwork string
15+
16+
const (
17+
DefaultNetwork = "tcp"
18+
Tcp4Network = "tcp4"
19+
Tcp6Network = "tcp6"
20+
)
21+
1422
const (
1523
// ACMETLS1Protocol is the ALPN Protocol ID for the ACME-TLS/1 Protocol.
1624
ACMETLS1Protocol = "acme-tls/1"
@@ -26,14 +34,23 @@ const (
2634
type ProviderServer struct {
2735
iface string
2836
port string
37+
network string
2938
listener net.Listener
3039
}
3140

3241
// NewProviderServer creates a new ProviderServer on the selected interface and port.
3342
// Setting iface and / or port to an empty string will make the server fall back to
3443
// the "any" interface and port 443 respectively.
35-
func NewProviderServer(iface, port string) *ProviderServer {
36-
return &ProviderServer{iface: iface, port: port}
44+
func NewProviderServer(iface, port string, network ProviderNetwork) *ProviderServer {
45+
if port == "" {
46+
port = defaultTLSPort
47+
}
48+
49+
if network == "" {
50+
network = DefaultNetwork
51+
}
52+
53+
return &ProviderServer{iface: iface, port: port, network: string(network)}
3754
}
3855

3956
func (s *ProviderServer) GetAddress() string {
@@ -65,7 +82,7 @@ func (s *ProviderServer) Present(domain, token, keyAuth string) error {
6582
tlsConf.NextProtos = []string{ACMETLS1Protocol}
6683

6784
// Create the listener with the created tls.Config.
68-
s.listener, err = tls.Listen("tcp", s.GetAddress(), tlsConf)
85+
s.listener, err = tls.Listen(s.network, s.GetAddress(), tlsConf)
6986
if err != nil {
7087
return fmt.Errorf("could not start HTTPS server for challenge: %w", err)
7188
}

challenge/tlsalpn01/tls_alpn_challenge_test.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"crypto/tls"
99
"encoding/asn1"
1010
"net/http"
11+
"os"
1112
"testing"
1213

1314
"github.com/go-acme/lego/v4/acme"
@@ -18,6 +19,53 @@ import (
1819
"github.com/stretchr/testify/require"
1920
)
2021

22+
func TestProviderServer_GetAddress(t *testing.T) {
23+
dir := t.TempDir()
24+
t.Cleanup(func() { _ = os.RemoveAll(dir) })
25+
26+
testCases := []struct {
27+
desc string
28+
server *ProviderServer
29+
expected string
30+
}{
31+
{
32+
desc: "TCP default address",
33+
server: NewProviderServer("", "", ""),
34+
expected: ":443",
35+
},
36+
{
37+
desc: "TCP with explicit port",
38+
server: NewProviderServer("", "4443", ""),
39+
expected: ":4443",
40+
},
41+
{
42+
desc: "TCP with host and port",
43+
server: NewProviderServer("localhost", "4443", ""),
44+
expected: "localhost:4443",
45+
},
46+
{
47+
desc: "TCP4 with host and port",
48+
server: NewProviderServer("localhost", "4443", Tcp4Network),
49+
expected: "localhost:4443",
50+
},
51+
{
52+
desc: "TCP6 with host and port",
53+
server: NewProviderServer("localhost", "4443", Tcp6Network),
54+
expected: "localhost:4443",
55+
},
56+
}
57+
58+
for _, test := range testCases {
59+
test := test
60+
t.Run(test.desc, func(t *testing.T) {
61+
t.Parallel()
62+
63+
address := test.server.GetAddress()
64+
assert.Equal(t, test.expected, address)
65+
})
66+
}
67+
}
68+
2169
func TestChallenge(t *testing.T) {
2270
_, apiURL := tester.SetupFakeAPI(t)
2371

cmd/setup_challenges.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,16 @@ func setupHTTPProvider(ctx *cli.Context) challenge.Provider {
9494
}
9595

9696
func setupTLSProvider(ctx *cli.Context) challenge.Provider {
97+
var network tlsalpn01.ProviderNetwork
98+
switch {
99+
case ctx.IsSet("ipv4only") && ctx.IsSet("ipv6only"):
100+
network = tlsalpn01.DefaultNetwork
101+
case ctx.IsSet("ipv4only"):
102+
network = tlsalpn01.Tcp4Network
103+
case ctx.IsSet("ipv6only"):
104+
network = tlsalpn01.Tcp6Network
105+
}
106+
97107
switch {
98108
case ctx.IsSet("tls.port"):
99109
iface := ctx.String("tls.port")
@@ -106,9 +116,9 @@ func setupTLSProvider(ctx *cli.Context) challenge.Provider {
106116
log.Fatal(err)
107117
}
108118

109-
return tlsalpn01.NewProviderServer(host, port)
119+
return tlsalpn01.NewProviderServer(host, port, network)
110120
case ctx.Bool("tls"):
111-
return tlsalpn01.NewProviderServer("", "")
121+
return tlsalpn01.NewProviderServer("", "", network)
112122
default:
113123
log.Fatal("Invalid HTTP challenge options.")
114124
return nil

e2e/challenges_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ func TestChallengeHTTP_Client_Obtain(t *testing.T) {
212212
client, err := lego.NewClient(config)
213213
require.NoError(t, err)
214214

215-
err = client.Challenge.SetHTTP01Provider(http01.NewProviderServer("", "5002"))
215+
err = client.Challenge.SetHTTP01Provider(http01.NewProviderServer("", "5002", ""))
216216
require.NoError(t, err)
217217

218218
reg, err := client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed: true})
@@ -250,7 +250,7 @@ func TestChallengeHTTP_Client_Registration_QueryRegistration(t *testing.T) {
250250
client, err := lego.NewClient(config)
251251
require.NoError(t, err)
252252

253-
err = client.Challenge.SetHTTP01Provider(http01.NewProviderServer("", "5002"))
253+
err = client.Challenge.SetHTTP01Provider(http01.NewProviderServer("", "5002", ""))
254254
require.NoError(t, err)
255255

256256
reg, err := client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed: true})
@@ -282,7 +282,7 @@ func TestChallengeTLS_Client_Obtain(t *testing.T) {
282282
client, err := lego.NewClient(config)
283283
require.NoError(t, err)
284284

285-
err = client.Challenge.SetTLSALPN01Provider(tlsalpn01.NewProviderServer("", "5001"))
285+
err = client.Challenge.SetTLSALPN01Provider(tlsalpn01.NewProviderServer("", "5001", ""))
286286
require.NoError(t, err)
287287

288288
reg, err := client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed: true})
@@ -325,7 +325,7 @@ func TestChallengeTLS_Client_ObtainForCSR(t *testing.T) {
325325
client, err := lego.NewClient(config)
326326
require.NoError(t, err)
327327

328-
err = client.Challenge.SetTLSALPN01Provider(tlsalpn01.NewProviderServer("", "5001"))
328+
err = client.Challenge.SetTLSALPN01Provider(tlsalpn01.NewProviderServer("", "5001", ""))
329329
require.NoError(t, err)
330330

331331
reg, err := client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed: true})

0 commit comments

Comments
 (0)