你使用的Go版本是什么( go version
)?
$ go version
go version go1.19.6 linux/amd64
这个问题在最新版本的发布中是否重现?
是的。
你正在使用什么操作系统和处理器架构( go env
)?
go env
输出
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/rittneje/.cache/go-build"
GOENV="/home/rittneje/.config/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/home/rittneje/go-workspace/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/rittneje/go-workspace"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/home/jrittner/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/home/rittneje/go/pkg/tool/linux_amd64"
GOVCS=""
GOVERSION="go1.19.6"
GCCGO="gccgo"
GOAMD64="v1"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/home/rittneje/go-workspace/src/certtest/go.mod"
GOWORK=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build3903595383=/tmp/go-build -gno-record-gcc-switches"
你做了什么?
我创建了三个证书 - 根证书,中间证书和叶子证书。中间证书已经过期了。然后我在叶子证书上运行了 Certificate.Verify
。
https://go.dev/play/p/WIWEm7L0Bel
你期望看到什么?
我期望得到一个 x509.CertificateInvalidError
嵌套在 x509.UnknownAuthorityError
中。
你看到了什么?
我得到了一个未 Package 的 x509.CertificateInvalidError
。因此,生成的错误消息上下文不足。
这是由于 Certificate.buildChains
中的范围/遮蔽错误导致的。
go/src/crypto/x509/verify.go
第926行到第933行 in dd16258
| | err=candidate.isValid(certType, currentChain, opts) |
| | iferr!=nil { |
| | ifhintErr==nil { |
| | hintErr=err |
| | hintCert=candidate |
| | } |
| | return |
| | } |
那个 err
是来自外部范围的命名返回值。所以在函数结束时,因为它不是空的,所以它从未被 Package 。
go/src/crypto/x509/verify.go
第955行到第957行 in dd16258
| | iflen(chains) ==0&&err==nil { |
| | err=UnknownAuthorityError{c, hintErr, hintCert} |
| | } |
2条答案
按热度按时间e4yzc0pl1#
感谢你发现并报告这个问题。
抄送 @golang/security。
q43xntqr2#
我们可能应该(a)始终从
Verify
返回一个UnknownAuthorityError
, Package 在链构建过程中发现的错误,并(b)在UnknownAuthorityError
上实现Unwrap
,以便访问提示,因为它本质上是一个 Package 错误。尽管如此,目前仍有一些情况我们预计会返回不同的错误类型(如我们明确测试这些情况的事实所示)。也许打破这些规则是合理的,特别是如果我们实现了 Unwrap,但这是值得考虑的。