我是使用 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.PublicKeypk = publicKey.(*ecdsa.PublicKey)cert, err := x509.CreateCertificate( random, &certTemplate, cert, pk, privateKey)但后来我收到此错误:panic: interface conversion: interface {} is nil, not *ecdsa.PublicKey如果我将 &pk 作为参数传递,则会发生同样的错误。这就是我生成公钥的方式:// Generate key paircurve := elliptic.P384()privateKey := new(ecdsa.PrivateKey)privateKey, err := ecdsa.GenerateKey(curve, rand.Reader)publicKey := &privatekey.PublicKey// Obtain bytes from public key for communication using protobufpublicKeyBytes, err := x509.MarshalPKIXPublicKey(publicKey)// Protobuf communication takes place herereceivedPublicKey, err := x509.ParsePKIXPublicKey(publicKeyBytes)// verification of public key here (the verification ends successfully)// populate X.509 template// create certificatecertificate, err := x509.CreateCertificate( random, &certificateTemplate, certificate, receivedPublicKey, privateKey,)如果有人能指出我正确的方向或知道如何解决这个问题,那将非常有帮助。提前致谢!
2 回答
MMTTMM
TA贡献1869条经验 获得超4个赞
我让它工作做这样的事情:
// Generate key pair
curve := elliptic.P384()
//privateKey := new(ecdsa.PrivateKey)
privateKey, err := ecdsa.GenerateKey(curve, rand.Reader)
publicKey := &privateKey.PublicKey
其余的与您所写的完全一样,看看您是否可以反映这一点并使其工作。
繁花如伊
TA贡献2012条经验 获得超12个赞
该crypto/tls
包包含一个名为的文件generate_cert.go
,该文件显示了生成自签名证书的正确且惯用的方法。
你可以在这里找到它:https : //golang.org/src/crypto/tls/generate_cert.go
或者通过浏览安装 Go 的文件系统位置的 tls 包目录中的文件。
有很多事情应该正确完成,但不能一一列举,阅读、运行、修改和理解代码是在生成证书时掌握如何使用加密包的最佳方式。
特别要注意您x509.CreateCertificate
作为公钥和私钥传递给函数的内容。在加密包中,密钥的interface{}
类型愉快而危险地将编译时类型检查转换为运行时类型检查。
- 2 回答
- 0 关注
- 252 浏览
添加回答
举报
0/150
提交
取消