我是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,
)
如果有人可以指出我正确的方向或知道如何解决这个问题,那将非常有帮助。提前谢谢!
答案 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{}
类型,它可以快速而危险地将编译时类型检查转换为运行时类型检查。