@@ -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+ }
0 commit comments