From 2680804ebc97c1e319827ccd11556ff8df3c784e Mon Sep 17 00:00:00 2001 From: Adam Langley Date: Fri, 21 Feb 2014 15:56:41 -0500 Subject: [PATCH] crypto/tls: enforce that either ServerName or InsecureSkipVerify be given. crypto/tls has two functions for creating a client connection: Dial, which most users are expected to use, and Client, which is the lower-level API. Dial does what you expect: it gives you a secure connection to the host that you specify and the majority of users of crypto/tls appear to work fine with it. Client gives more control but needs more care. Specifically, if it wasn't given a server name in the tls.Config then it didn't check that the server's certificates match any hostname - because it doesn't have one to check against. It was assumed that users of the low-level API call VerifyHostname on the certificate themselves if they didn't supply a hostname. A review of the uses of Client both within Google and in a couple of external libraries has shown that nearly all of them got this wrong. Thus, this change enforces that either a ServerName or InsecureSkipVerify is given. This does not affect tls.Dial. See discussion at https://groups.google.com/d/msg/golang-nuts/4vnt7NdLvVU/b1SJ4u0ikb0J. Fixes #7342. LGTM=bradfitz R=golang-codereviews, bradfitz CC=golang-codereviews https://golang.org/cl/67010043 --- handshake_client.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/handshake_client.go b/handshake_client.go index fd1303eebb947f..0d8d9a1d46f9c3 100644 --- a/handshake_client.go +++ b/handshake_client.go @@ -33,6 +33,10 @@ func (c *Conn) clientHandshake() error { c.config = defaultConfig() } + if len(c.config.ServerName) == 0 && !c.config.InsecureSkipVerify { + return errors.New("tls: either ServerName or InsecureSkipVerify must be specified in the tls.Config") + } + hello := &clientHelloMsg{ vers: c.config.maxVersion(), compressionMethods: []uint8{compressionNone},