go net/http/httptest: 服务器不检查GetCertificate

oo7oh9g9  于 3个月前  发布在  Go
关注(0)|答案(4)|浏览(46)

你正在使用的Go版本是什么( go version )?

go version go1.21.3 linux/amd64

这个问题在最新版本的发布中是否重现?

是的。

你正在使用什么操作系统和处理器架构( go env )?

go env 输出

$ go env
GO111MODULE=''
GOARCH='amd64'
GOBIN=''
GOCACHE='/home/mitar/.cache/go-build'
GOENV='/home/mitar/.config/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFLAGS=''
GOHOSTARCH='amd64'
GOHOSTOS='linux'
GOINSECURE=''
GOMODCACHE='/home/mitar/.go/pkg/mod'
GONOPROXY=''
GONOSUMDB=''
GOOS='linux'
GOPATH='/home/mitar/.go'
GOPRIVATE=''
GOPROXY='https://proxy.golang.org,direct'
GOROOT='/usr/local/go'
GOSUMDB='sum.golang.org'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/usr/local/go/pkg/tool/linux_amd64'
GOVCS=''
GOVERSION='go1.21.3'
GCCGO='/usr/bin/gccgo'
GOAMD64='v1'
AR='ar'
CC='gcc'
CXX='g++'
CGO_ENABLED='1'
GOMOD='/dev/null'
GOWORK=''
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
PKG_CONFIG='pkg-config'
GOGCCFLAGS='-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -ffile-prefix-map=/tmp/go-build488527063=/tmp/go-build -gno-record-gcc-switches'

你做了什么?

我正在尝试测试一个 http.Server 示例,使用httptest的 Server :

ts := httptest.NewUnstartedServer(nil)
	ts.EnableHTTP2 = true
	ts.Config = server
	ts.Config.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.WriteHeader(http.StatusOK)
	})
	ts.TLS = server.TLSConfig.Clone()
	ts.StartTLS()

我想检查服务器的TLS配置是否正常工作。服务器的TLS配置使用了 GetCertificate

你期望看到什么?

一旦我调用 StartTLS ,就会调用 GetCertificate 以获取证书来配置测试服务器和测试客户端。

你看到了什么?

StartTLS 忽略了并从未调用 GetCertificate ,而是将测试服务器和测试客户端配置为使用测试证书。

讨论

我可以在调用 StartTLS 之前调用一些东西,如:

cert, _ := ts.TLS.GetCertificate(nil) // or some other relevant ClientHelloInfo for 127.0.0.1
	ts.TLS.Certificates = []tls.Certificate{*cert}

但理想情况下,这应该由 StartTLS 调用。这在 tls.Config 中有记录:

// Server configurations must set one of Certificates, GetCertificate or
	// GetConfigForClient.

目前只检查了 Certificates ,但 GetCertificateGetConfigForClient 被忽略了。
我的动机是使用 golang.org/x/crypto/acme/autocert 作为管理器与 Pebble 进行测试,以测试 http.Server 的配置和一切是否正常工作。

ou6hu8tu

ou6hu8tu1#

问题来源:
go/src/net/http/httptest/server.go
第167行到第169行:
| | iflen(s.TLS.Certificates) ==0 { |
| | s.TLS.Certificates= []tls.Certificate{cert} |
| | } |
我猜它也可以检查s.TLS.GetCertificate == nil。但是在那种情况下,我不知道Certificate方法应该返回什么。
我还要指出,httptest.Server的行为似乎完全没有记录。

bq3bfh9z

bq3bfh9z2#

我认为GetCertificate应该以127.0.0.1(或更准确地说,s.Listener.Addr())作为参数调用。这是它在s.URL中设置的内容。然后可以存储在s.certificate中。

nkcskrwz

nkcskrwz3#

GetCertificate 接受整个 ClientHelloInfo,而不仅仅是一个主机名。

b91juud3

b91juud34#

@rittneje,是的,我知道。我的意思应该是一个虚拟的ClientHelloInfo,其中包含s.Listener.Addr()

相关问题