使用Golang读取pfx格式证书里面的私钥,用RSA算法签名数据。
代码如下:
package main
import (
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/sha256"
"encoding/base64"
"log"
"os"
pkcs12 "software.sslmate.com/src/go-pkcs12"
)
func main() {
rsaSingFromPfxKey()
}
func rsaSingFromPfxKey() {
data := "测试数据"
// 读取pfx私钥
certPath := "./20190801.3300000002925831.pfx"
certBytes, err := os.ReadFile(certPath)
if err != nil {
log.Fatal(err)
}
pkey, _, _ := pkcs12.Decode(certBytes, "123456")
// 导出pfx的私钥使用
// pfx文件提取私钥:openssl pkcs12 -in 20190801.3300000002925831.pfx -out my.key -nocerts -nodes
// -nodes 参数提取的私钥文件不加密码
// keybyte, _ := os.ReadFile("./my.key")
// block, _ := pem.Decode(keybyte)
// pkey, err := x509.ParsePKCS8PrivateKey(block.Bytes)
// if err != nil {
// log.Fatal(err)
// }
privateKey, ok := pkey.(*rsa.PrivateKey)
if !ok {
log.Println("parse private key fail")
return
}
// 使用私钥签名数据
hashed := sha256.Sum256([]byte(data))
signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, hashed[:])
if err != nil {
log.Println(err)
return
}
// 验证签名
publicKey := privateKey.PublicKey
err = rsa.VerifyPKCS1v15(&publicKey, crypto.SHA256, hashed[:], signature)
if err != nil {
log.Println("verify fail", err)
} else {
log.Println("verify success")
}
// 编码签名
log.Println(base64.StdEncoding.EncodeToString(signature))
}
仓库地址:github
本文链接:https://360us.net/article/94.html