你正在使用的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
,但 GetCertificate
或 GetConfigForClient
被忽略了。
我的动机是使用 golang.org/x/crypto/acme/autocert
作为管理器与 Pebble 进行测试,以测试 http.Server
的配置和一切是否正常工作。
4条答案
按热度按时间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
的行为似乎完全没有记录。bq3bfh9z2#
我认为
GetCertificate
应该以127.0.0.1
(或更准确地说,s.Listener.Addr()
)作为参数调用。这是它在s.URL
中设置的内容。然后可以存储在s.certificate
中。nkcskrwz3#
GetCertificate
接受整个ClientHelloInfo
,而不仅仅是一个主机名。b91juud34#
@rittneje,是的,我知道。我的意思应该是一个虚拟的
ClientHelloInfo
,其中包含s.Listener.Addr()
。