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

时间:2015-11-18 20:25:02

标签: go x509certificate

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

cert, err := x509.CreateCertificate(
    random,
    &certTemplate,
    cert,
    publicKey,
    privateKey
)

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

我遇到的错误是:

x509:仅支持RSA和ECDSA公钥

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

var pk *ecdsa.PublicKey
pk = publicKey.(*ecdsa.PublicKey)

cert, err := x509.CreateCertificate(
    random,
    &certTemplate,
    cert,
    pk,
    privateKey
)

然后我收到此错误: panic:接口转换:interface {}为nil,而不是* 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,
)

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

2 个答案:

答案 0 :(得分:3)

我让它做这样的事情:

// Generate key pair
curve := elliptic.P384()
//privateKey := new(ecdsa.PrivateKey)
privateKey, err := ecdsa.GenerateKey(curve, rand.Reader)
publicKey := &privateKey.PublicKey

其余的就像你写的那样,看看你是否可以反映这一点并让它发挥作用。

答案 1 :(得分:1)

crypto/tls包中包含一个名为generate_cert.go的文件,该文件显示了生成自签名证书的正确和惯用方法。

你可以在这里找到它: https://golang.org/src/crypto/tls/generate_cert.go

或者浏览安装Go的文件系统位置的tls包目录中的文件。

有许多事情应该正确完成,而不是枚举它们,阅读,运行,修改和理解代码是在生成证书时如何使用加密包的最佳方法。< / p>

特别要注意作为公钥和私钥传递给x509.CreateCertificate函数的内容。在加密包中,密钥属于interface{}类型,它可以快速而危险地将编译时类型检查转换为运行时类型检查。