首页 > 后端开发 > Golang > 正文

tls.X509KeyPair 弹出'无法在证书输入中找到任何 PEM 数据”错误

WBOY
发布: 2024-02-05 23:00:08
转载
1322 人浏览过

tls.X509KeyPair 弹出“无法在证书输入中找到任何 PEM 数据”错误

问题内容

我正在尝试通过 golang x509 包为 https 服务器制作 tls 证书

我收到了这个错误

tls: failed to find any pem data in certificate input
登录后复制

经过一番研究,我像这样创建了我的证书

func generatecert()  {
    ca := &x509.certificate{
        serialnumber: big.newint(2023),
        subject: pkix.name{
            organization:       []string{"company"},
            organizationalunit: []string{"lol"},
            country:            []string{"us"},
            province:           []string{""},
            locality:           []string{"ny"},
            streetaddress:      []string{"no street"},
            postalcode:         []string{"77777"},
        },
        notbefore:             time.now(),
        notafter:              time.now().adddate(10, 0, 0),
        subjectkeyid:          []byte{1, 2, 3, 4, 5},
        basicconstraintsvalid: true,
        isca:                  true,
        extkeyusage:           []x509.extkeyusage{x509.extkeyusageclientauth, x509.extkeyusageserverauth},
        keyusage:              x509.keyusagedigitalsignature | x509.keyusagecertsign,
    }

    certpubl, certpriv, err := ed25519.generatekey(rand.reader)
    if err != nil {
        log.println("key generate failed", err)
        return
    }

    certcert, err := x509.createcertificate(rand.reader, ca, ca, certpubl, certpriv)
    if err != nil {
        log.println("create cert failed", err)
        return
    }

    out := &bytes.buffer{}

    //encoding cert
    certtestpem := &pem.block{type: "certificate", bytes: certcert}
    pem.encode(out, certtestpem)
    publiccert := out.bytes()
    certderblock, publiccert := pem.decode(publiccert)

    //check decoded cert
    print(certderblock.type, "\n")
    if publiccert != nil {
        print("publiccert nil\n")
    }

    //encoding private key
    out.reset()
    privatepem, _ := x509.marshalpkcs8privatekey(certpriv)
    pem.encode(out, &pem.block{type: "private key", bytes: privatepem})
    privitkey := out.bytes()

    //check keypair
    _, err = tls.x509keypair(publiccert, privitkey)
    if err != nil {
        print(err.error())
    }
}
登录后复制

它显示如下错误

CERTIFICATE
publicCert nil
tls: failed to find any PEM data in certificate input
登录后复制

我尝试在 pem.encodetomemory 之后解码

pem.type 是正确的,但变量“publiccert”为零,我尝试添加 n 证书的开头,它什么也没做,但证书本身不为零,有人可以帮助我吗

我该如何做才能使 tls 正常工作???


正确答案


这段代码有几个问题

publiccert := out.bytes()
登录后复制

现阶段检查publiccert的内容显示了期望值。但以下语句将简单地覆盖 publiccert

certderblock, publiccert := pem.decode(publiccert)
登录后复制

通过检查此语句后的 publiccert 可以看到这一点。 如文档所述 publiccert 现在将在实际证书之后显示数据。

应该是这样

certderblock, _ := pem.decode(publiccert)
登录后复制

检查此更正语句后的 publiccert 内容再次显示预期值。

out.reset()
privatepem, _ := x509.marshalpkcs8privatekey(certpriv)
pem.encode(out, &pem.block{type: "private key", bytes: privatepem})
privitkey := out.bytes()
登录后复制

这会将预期值获取到 privitkey 中。但是,它将更改 privitkey 中。但是,它将更改 publiccert,因为它只是 out 的一部分,并且 out 已更改操作。因此,out 现在将在开头包含 privitkey,而不再是证书的开头 - 这反映在 publiccert,因为它只是 out 的一部分,并且 out 已更改操作。因此,out 现在将在开头包含 privitkey,而不再是证书的开头 - 这反映在

的值中。

另请参阅bytes.buffer.bytes 的文档

切片仅在下一次缓冲区修改之前有效

(即,仅在下次调用 read、write、reset 或 truncate 等方法之前有效)

因此,不仅仅是重置现有缓冲区

out.reset()
登录后复制
privitkey 创建一个新缓冲区,并为 publiccert最好为 privitkey 创建一个新缓冲区,并为

保留现有缓冲区🎜
out = &bytes.Buffer{}
登录后复制

以上是tls.X509KeyPair 弹出'无法在证书输入中找到任何 PEM 数据”错误的详细内容。更多信息请关注PHP中文网其他相关文章!

相关标签:
lol
来源:stackoverflow.com
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!