Go使用pfx格式证书私钥RSA签名数据

 提示:转载请注明原文链接

 本文永久链接:https://360us.net/article/94.html

使用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

 评论
暂无评论