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

Error generating X.509 certificate in Go

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

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

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

我遇到的错误是:

x509:仅支持 RSA 和 ECDSA public 密钥

我得出的结论是,这是将 public 作为接口{} 键入的键传递给 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 作为参数.

这就是我生成 public 密钥的方式:

// 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,
)

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

我做了这样的事情:

// Generate key pair
curve := 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 包目录中的文件。

有很多事情应该正确完成,但不一一列举,阅读,运行,修改和理解代码是掌握如何使用加密货币的最佳方式生成证书时的包。

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