mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
crypto/tls: don't send IP literals as SNI values.
(This relands commit a4dcc69201.)
https://tools.ietf.org/html/rfc6066#section-3 states:
“Literal IPv4 and IPv6 addresses are not permitted in "HostName".”
However, if an IP literal was set as Config.ServerName (which could
happen as easily as calling Dial with an IP address) then the code would
send the IP literal as the SNI value.
This change filters out IP literals, as recognised by net.ParseIP, from
being sent as the SNI value.
Fixes #13111.
Change-Id: I6e544a78a01388f8fe98150589d073b917087f75
Reviewed-on: https://go-review.googlesource.com/16776
Run-TryBot: Adam Langley <agl@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
7bacfc640f
commit
9f08b6c494
4 changed files with 44 additions and 5 deletions
|
|
@ -600,3 +600,30 @@ func TestHandshakClientSCTs(t *testing.T) {
|
|||
}
|
||||
runClientTestTLS12(t, test)
|
||||
}
|
||||
|
||||
func TestNoIPAddressesInSNI(t *testing.T) {
|
||||
for _, ipLiteral := range []string{"1.2.3.4", "::1"} {
|
||||
c, s := net.Pipe()
|
||||
|
||||
go func() {
|
||||
client := Client(c, &Config{ServerName: ipLiteral})
|
||||
client.Handshake()
|
||||
}()
|
||||
|
||||
var header [5]byte
|
||||
if _, err := io.ReadFull(s, header[:]); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
recordLen := int(header[3])<<8 | int(header[4])
|
||||
|
||||
record := make([]byte, recordLen)
|
||||
if _, err := io.ReadFull(s, record[:]); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
s.Close()
|
||||
|
||||
if bytes.Index(record, []byte(ipLiteral)) != -1 {
|
||||
t.Errorf("IP literal %q found in ClientHello: %x", ipLiteral, record)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue