Skip to content

Commit cd49492

Browse files
committed
Read ServerName from Client, not server Config
Resolves #319
1 parent b8f72f3 commit cd49492

2 files changed

Lines changed: 81 additions & 1 deletion

File tree

conn_test.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2384,3 +2384,83 @@ func TestCipherSuiteMatchesCertificateType(t *testing.T) {
23842384
})
23852385
}
23862386
}
2387+
2388+
// Test that we return the proper certificate if we are serving multiple ServerNames on a single Server
2389+
func TestMultipleServerCertificates(t *testing.T) {
2390+
fooCert, err := selfsign.GenerateSelfSignedWithDNS("foo")
2391+
if err != nil {
2392+
t.Fatal(err)
2393+
}
2394+
2395+
barCert, err := selfsign.GenerateSelfSignedWithDNS("bar")
2396+
if err != nil {
2397+
t.Fatal(err)
2398+
}
2399+
2400+
caPool := x509.NewCertPool()
2401+
for _, cert := range []tls.Certificate{fooCert, barCert} {
2402+
certificate, err := x509.ParseCertificate(cert.Certificate[0])
2403+
if err != nil {
2404+
t.Fatal(err)
2405+
}
2406+
caPool.AddCert(certificate)
2407+
}
2408+
2409+
for _, test := range []struct {
2410+
RequestServerName string
2411+
ExpectedDNSName string
2412+
}{
2413+
{
2414+
"foo",
2415+
"foo",
2416+
},
2417+
{
2418+
"bar",
2419+
"bar",
2420+
},
2421+
{
2422+
"invalid",
2423+
"foo",
2424+
},
2425+
} {
2426+
test := test
2427+
t.Run(test.RequestServerName, func(t *testing.T) {
2428+
clientErr := make(chan error, 2)
2429+
client := make(chan *Conn, 1)
2430+
2431+
ca, cb := dpipe.Pipe()
2432+
go func() {
2433+
c, err := testClient(context.TODO(), ca, &Config{
2434+
RootCAs: caPool,
2435+
ServerName: test.RequestServerName,
2436+
VerifyPeerCertificate: func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error {
2437+
certificate, err := x509.ParseCertificate(rawCerts[0])
2438+
if err != nil {
2439+
return err
2440+
}
2441+
2442+
if certificate.DNSNames[0] != test.ExpectedDNSName {
2443+
return errWrongCert
2444+
}
2445+
2446+
return nil
2447+
},
2448+
}, false)
2449+
clientErr <- err
2450+
client <- c
2451+
}()
2452+
2453+
if s, err := testServer(context.TODO(), cb, &Config{Certificates: []tls.Certificate{fooCert, barCert}}, false); err != nil {
2454+
t.Fatal(err)
2455+
} else if err = s.Close(); err != nil {
2456+
t.Fatal(err)
2457+
}
2458+
2459+
if c, err := <-client, <-clientErr; err != nil {
2460+
t.Fatal(err)
2461+
} else if err := c.Close(); err != nil {
2462+
t.Fatal(err)
2463+
}
2464+
})
2465+
}
2466+
}

flight4handler.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ func flight4Generate(c flightConn, state *State, cache *handshakeCache, cfg *han
242242

243243
switch {
244244
case state.cipherSuite.AuthenticationType() == CipherSuiteAuthenticationTypeCertificate:
245-
certificate, err := cfg.getCertificate(cfg.serverName)
245+
certificate, err := cfg.getCertificate(state.serverName)
246246
if err != nil {
247247
return nil, &alert.Alert{Level: alert.Fatal, Description: alert.HandshakeFailure}, err
248248
}

0 commit comments

Comments
 (0)