go crypto/x509: Certificate.Verify 未始终返回 UnknownAuthorityError

brqmpdu1  于 4个月前  发布在  Go
关注(0)|答案(2)|浏览(41)

你使用的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} |
| | } |

e4yzc0pl

e4yzc0pl1#

感谢你发现并报告这个问题。
抄送 @golang/security。

q43xntqr

q43xntqr2#

我们可能应该(a)始终从 Verify 返回一个 UnknownAuthorityError , Package 在链构建过程中发现的错误,并(b)在 UnknownAuthorityError 上实现 Unwrap ,以便访问提示,因为它本质上是一个 Package 错误。
尽管如此,目前仍有一些情况我们预计会返回不同的错误类型(如我们明确测试这些情况的事实所示)。也许打破这些规则是合理的,特别是如果我们实现了 Unwrap,但这是值得考虑的。

相关问题