为了账号安全,请及时绑定邮箱和手机立即绑定

数据库/sql Exec() 函数因连接字符串而失败

数据库/sql Exec() 函数因连接字符串而失败

Go
慕斯709654 2023-08-14 16:12:45
我想根据发行链验证 PEM 证书,该发行链也是一个.pem包含多个由换行符分隔的证书的文件,如本要点所示,https://gist.github.com/kurtpeek/8bf3282e344c781a20c5deadac75059f。我已经尝试过Certpool.AppendCertsFromPEM如下:package mainimport (    "crypto/x509"    "encoding/pem"    "io/ioutil"    "github.com/sirupsen/logrus")func main() {    caCertPEM, err := ioutil.ReadFile("issuing_chain.pem")    if err != nil {        logrus.WithError(err).Fatal("read CA PEM file")    }    certPEM, err := ioutil.ReadFile("3007e750-e769-440b-9075-41dc2b5b1787.pem")    if err != nil {        logrus.WithError(err).Fatal("read cert PEM file")    }    block, rest := pem.Decode(certPEM)    if block == nil {        logrus.WithField("rest", rest).Fatal("Decode CA PEM")    }    cert, err := x509.ParseCertificate(block.Bytes)    if err != nil {        logrus.WithError(err).Fatal("parse certificate")    }    roots := x509.NewCertPool()    roots.AppendCertsFromPEM(caCertPEM)    chain, err := cert.Verify(x509.VerifyOptions{Roots: roots})    if err != nil {        logrus.WithError(err).Fatal("failed to verify cert")    }    logrus.Infof("issuing chain: %+v", chain)}但是,如果我运行它,我会收到以下错误:FATA[0000] failed to verify cert                         error="x509: certificate specifies an incompatible key usage"exit status 1我相信此错误是在https://golang.org/src/crypto/x509/verify.go的第 790 行返回的:if len(chains) == 0 {    return nil, CertificateInvalidError{c, IncompatibleUsage, ""}}换句话说,该Verify()方法无法chains根据提供的选项构建任何内容。我尝试将中间体(issuing_chain.pem要点中显示的前两个)拆分为一个单独的 PEM 文件并将其添加到Intermediates中x509.VerifyOptions,但我仍然遇到相同的错误。在 Go 中根据发行链验证证书的正确方法是什么?
查看完整描述

1 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

您的叶证书仅用于客户端身份验证。


$ openssl x509 -noout -text -in leaf.pem  | grep -A1 'Key Usage'

            X509v3 Key Usage: critical

                Digital Signature, Key Encipherment

            X509v3 Extended Key Usage: 

                TLS Web Client Authentication

如果这是故意的,则必须指定 KeyUsages 选项,因为“空列表意味着 ExtKeyUsageServerAuth”。您还必须返回到单独提供中间证书的代码版本:


chain, err := cert.Verify(x509.VerifyOptions{

    Roots:         roots,

    Intermediates: inters,

    KeyUsages:     []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth},

})

在操场上尝试一下:https ://play.golang.org/p/1BNLthzu5Tz 。请注意,playground 需要 CurrentTime 选项才能正确验证。复制到其他地方时删除它!


查看完整回答
反对 回复 2023-08-14
  • 1 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信