go crypto/tls:客户端TLS认证失败,证书字段较长

kmb7vmvb  于 5个月前  发布在  Go
关注(0)|答案(5)|浏览(54)

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

go version go1.13.4 linux/amd64

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

是的

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

go env 输出

GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/user/.cache/go-build"
GOENV="/home/user/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/user/Revisions/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/lib/go-1.13"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/lib/go-1.13/pkg/tool/linux_amd64"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/home/user/go/src/helm.sh/helm/go.mod"
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 -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build386574731=/tmp/go-build -gno-record-gcc-switches"

你做了什么?

package main
import (
 "crypto/tls"
 "fmt"
 )
func main() {
 cert, err := tls.LoadX509KeyPair("./helm-test-crt", "./helm-test.key")
 fmt.Println(cert, err)
 }
Test certs:
 [https://gist.github.com/antevens/a05409165d33bd771e39bc219fe2c6bb/archive/e56cf114dee64a6b367abf08ab1c34a405a62f88.zip](https://gist.github.com/antevens/a05409165d33bd771e39bc219fe2c6bb/archive/e56cf114dee64a6b367abf08ab1c34a405a62f88.zip)
[helm/helm#7343](https://github.com/helm/helm/issues/7343)

你期望看到什么?

Client side TLS authentication succeed.

你看到了什么?

asn1: structure error: base 128 integer too large

pxyaymoc

pxyaymoc1#

https://golang.org/cl/248259提到了这个问题:encoding/asn1: add dynamic length integer support for base 128 integer parsing

krugob8w

krugob8w2#

See also #19933
Where did the OIDs in this cert come from? FWIW, derdump fails on it too:

$ derdump -i helm-test-crt 
C-0x0D  (45)
   C-0x0D  (45)
derdump: error -8183: SEC_ERROR_BAD_DER: security library: improperly formatted DER-encoded message.
derdump: errno=2: No such file or directory
k7fdbhmy

k7fdbhmy3#

嗨,Mike,谢谢你的回复。
证书以及由此衍生出的OID是由Foreman(RedHat Satellite)服务器创建的,它们用于分发诸如RPMs/Debs/Containers之类的东西,并且是rhn.redhat.com等核心事物的基础。
就我所理解的,OID之所以如此之长,是因为它们除了包含认证信息之外,还包含了授权信息(赋予了特定仓库/生命周期的访问权限的能力)。
也许像@ohadlevy或@tbrisker这样的更了解的人,来自@theforeman项目,如果需要的话可以进行详细说明。

fivyi3re

fivyi3re4#

在错误报告中提供的文件不是DER编码的。它们是PEM编码的。
如果你运行openssl asn1parse -inform PEM -in helm-test-cert,你会得到正常的输出。如果你运行openssl asn1parse -inform DER -in helm-test-cert,你会得到一个关于编码错误的信息。
要将它们转换为DER格式,你需要去除-----BEGIN...-----END...标记,然后对剩余部分进行base64解码。希望这对你有帮助!

pdtvr36n

pdtvr36n5#

/cc @agl@FiloSottile

相关问题