在 Go 中生成 X.509 证书时出错

我是使用 Go 的新手,我正在尝试使用以下代码生成 X.509 证书:


cert, err := x509.CreateCertificate(

    random,

    &certTemplate,

    cert,

    publicKey,

    privateKey

)

其中 publicKey 变量的类型为 interface{},它是调用 x509.ParsePKIXPublicKey(bytes) 的结果。


我遇到的错误是:


x509:仅支持 RSA 和 ECDSA 公钥


我得出的结论是,这是将输入为 interface{} 的 publicKey 传递给 x509.CreateCertificate 函数的结果,因为它与该函数内的类型开关不匹配。我尝试以相同的结果传递 &publicKey。我还尝试使用 publicKey 进行类型断言,如下所示:


var pk *ecdsa.PublicKey

pk = publicKey.(*ecdsa.PublicKey)


cert, err := x509.CreateCertificate(

    random,

    &certTemplate,

    cert,

    pk,

    privateKey

)

但后来我收到此错误:panic: interface conversion: interface {} is nil, not *ecdsa.PublicKey如果我将 &pk 作为参数传递,则会发生同样的错误。


这就是我生成公钥的方式:


// Generate key pair

curve := elliptic.P384()

privateKey := new(ecdsa.PrivateKey)

privateKey, err := ecdsa.GenerateKey(curve, rand.Reader)

publicKey := &privatekey.PublicKey


// Obtain bytes from public key for communication using protobuf

publicKeyBytes, err := x509.MarshalPKIXPublicKey(publicKey)


// Protobuf communication takes place here


receivedPublicKey, err := x509.ParsePKIXPublicKey(publicKeyBytes)


// verification of public key here (the verification ends successfully)

// populate X.509 template


// create certificate

certificate, err := x509.CreateCertificate(

    random,

    &certificateTemplate,

    certificate,

    receivedPublicKey,

    privateKey,

)

如果有人能指出我正确的方向或知道如何解决这个问题,那将非常有帮助。提前致谢!


德玛西亚99
浏览 253回答 2
2回答

MMTTMM

我让它工作做这样的事情:// Generate key paircurve := elliptic.P384()//privateKey := new(ecdsa.PrivateKey)privateKey, err := ecdsa.GenerateKey(curve, rand.Reader)publicKey := &privateKey.PublicKey其余的与您所写的完全一样,看看您是否可以反映这一点并使其工作。

繁花如伊

该crypto/tls包包含一个名为的文件generate_cert.go,该文件显示了生成自签名证书的正确且惯用的方法。你可以在这里找到它:https : //golang.org/src/crypto/tls/generate_cert.go或者通过浏览安装 Go 的文件系统位置的 tls 包目录中的文件。有很多事情应该正确完成,但不能一一列举,阅读、运行、修改和理解代码是在生成证书时掌握如何使用加密包的最佳方式。特别要注意您x509.CreateCertificate作为公钥和私钥传递给函数的内容。在加密包中,密钥的interface{}类型愉快而危险地将编译时类型检查转换为运行时类型检查。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go