Ruby实现的OpenSSL SHA256签名转Go时私钥解析报错如何解决
私钥解析失败解决方案
错误原因是未先解码PEM格式的私钥块,直接将原始文件字节传入了解析方法,Go标准库的私钥解析方法要求先提取PEM块中的DER编码内容再做解析。完整可运行的迁移代码如下:
package main import ( "crypto" "crypto/rand" "crypto/sha256" "crypto/x509" "encoding/base64" "encoding/pem" "os" ) func main() { // 读取私钥文件,Go 1.16+ 推荐使用os.ReadFile替代废弃的ioutil.ReadFile signBytes, err := os.ReadFile(privKeyPath) if err != nil { panic(err) } // 解码PEM格式块,过滤头尾标识以外的内容 block, _ := pem.Decode(signBytes) if block == nil || block.Type != "PRIVATE KEY" { panic("invalid private key PEM format") } // 优先解析PKCS8格式通用私钥,兼容Ruby OpenSSL::PKey.read的自动识别逻辑 privateKey, err := x509.ParsePKCS8PrivateKey(block.Bytes) if err != nil { // 解析失败则降级尝试PKCS1格式的RSA私钥 privateKey, err = x509.ParsePKCS1PrivateKey(block.Bytes) if err != nil { panic(err) } } // 断言为签名器接口,兼容RSA、ECDSA等多种密钥类型的签名逻辑 signer, ok := privateKey.(crypto.Signer) if !ok { panic("private key type not support signing") } // 替换为你的待签名字符串 headerPayloadConcatenated signContent := []byte("your header + payload content") // 计算SHA256哈希,对齐Ruby的OpenSSL::Digest::SHA256逻辑 hashed := sha256.Sum256(signContent) // 生成签名 signature, err := signer.Sign(rand.Reader, hashed[:], crypto.SHA256) if err != nil { panic(err) } // 严格Base64编码,对齐Ruby的Base64.strict_encode64逻辑,无多余换行 base64Signature := base64.StdEncoding.Strict().EncodeToString(signature) }
- 上述代码自动兼容PKCS8、PKCS1两种最常见的私钥格式,和Ruby的
OpenSSL::PKey.read自动识别逻辑对齐 - 签名、编码逻辑完全和原Ruby实现一致,不会出现校验不通过的问题
内容的提问来源于stack exchange,提问作者useranon
相关产品推荐
相关产品推荐

