Skip to content

net/http: tls.Config.ServerName ignored on line 501 of net/http/transport.go #5829

Closed
@gopherbot

Description

@gopherbot

by mail@stefanofratini.it:

Hello

I've been struggling with an annoying problem with HTTPS communication between 2 golang
powered hosts (both go1.1 powered)

The server component uses a certificate signed by a CA that I've generated with openssl

The client component connects to the server via https using the public key of CA as the
rootCA for the connection

Everything works fine if the client connects to the server using a DNS name. Instead if
the client connects specifying an IP address in the URL and using the ServerName field
of the tls.Config struct:

tr := &http.Transport{
        TLSClientConfig: &tls.Config{RootCAs: certPool, ServerName: "host-name"},
    }

the hostname validation fails.

It seemed to me like the ServerName field was somewhere ignored and I think I was
correct.

I've identified the problem at the following lines (starting from 501) of
net/http/transport.go

if t.TLSClientConfig == nil || !t.TLSClientConfig.InsecureSkipVerify {
            if err = conn.(*tls.Conn).VerifyHostname(cm.tlsHost()); err != nil {
                return nil, err
            }
        }

The correct code should be instead

if t.TLSClientConfig == nil || !t.TLSClientConfig.InsecureSkipVerify {
            if err = conn.(*tls.Conn).VerifyHostname(cfg.ServerName); err != nil {
                return nil, err
            }
        }

I've recompiled GO and tested the new code successfully

I'm not sure what's the best way to contribute new code as I'm not a Mercurial expert...
Apologies if I'm entering this in the wrong place

**Which compiler are you using (5g, 6g, 8g, gccgo)?**
Not sure, default linux compiler

**Which operating system are you using?**
Lubuntu 12.04

**Which version are you using?  (run 'go version')**
Go1.1

Stefano

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions