138 lines
3.0 KiB
Go
138 lines
3.0 KiB
Go
package main
|
|
|
|
import (
|
|
"crypto"
|
|
"crypto/rand"
|
|
"crypto/rsa"
|
|
"crypto/sha256"
|
|
"crypto/x509"
|
|
"encoding/pem"
|
|
"fmt"
|
|
"os"
|
|
)
|
|
|
|
// LoadCert 读取证书文件
|
|
func LoadCert(path string) (*x509.Certificate, error) {
|
|
//1.打开磁盘的公钥文件
|
|
file, err := os.Open(path)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer file.Close()
|
|
fileInfo, err := file.Stat()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
buf := make([]byte, fileInfo.Size())
|
|
_, err = file.Read(buf)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
//2.使用pem解码得到pem.Block结构体变量
|
|
block, _ := pem.Decode(buf)
|
|
|
|
//证书解析
|
|
certBody, err := x509.ParseCertificate(block.Bytes)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return certBody, nil
|
|
}
|
|
|
|
// LoadPriKey 读取私钥文件
|
|
func LoadPriKey(path string) (*rsa.PrivateKey, error) {
|
|
//1.打开磁盘的私钥文件
|
|
file, err := os.Open(path)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer file.Close()
|
|
//2.将私钥文件中的内容读出
|
|
fileInfo, err := file.Stat()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
buf := make([]byte, fileInfo.Size())
|
|
_, err = file.Read(buf)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
//3.使用pem对数据解码,得到pem.Block结构体变量
|
|
block, _ := pem.Decode(buf)
|
|
//4.x509将数据解析成私钥结构体得到私钥
|
|
privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return privateKey, nil
|
|
}
|
|
|
|
// SignRSA RSA 签名
|
|
func SignRSA(plainText []byte, priKey *rsa.PrivateKey) ([]byte, error) {
|
|
//1.创建一个哈希对象
|
|
hash := sha256.New()
|
|
//2.给哈希对象添加数据
|
|
_, err := hash.Write(plainText)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
//3.计算哈希值
|
|
hashed := hash.Sum(nil)
|
|
//4.使用rsa中的函数对散列值签名
|
|
signText, err := rsa.SignPKCS1v15(rand.Reader, priKey, crypto.SHA256, hashed)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return signText, nil
|
|
}
|
|
|
|
func VerifyRSA(plainText, signText []byte, cert *x509.Certificate) error {
|
|
publicKeyDer, err := x509.MarshalPKIXPublicKey(cert.PublicKey)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
pubKeyInterface, err := x509.ParsePKIXPublicKey(publicKeyDer)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
//进行类型断言得到公钥结构体
|
|
publicKey := pubKeyInterface.(*rsa.PublicKey)
|
|
|
|
//* 创建哈希接口
|
|
hash := sha256.New()
|
|
//* 添加数据
|
|
hash.Write(plainText)
|
|
//* 哈希运算
|
|
hasded := hash.Sum(nil)
|
|
//
|
|
//6.签名认证
|
|
err = rsa.VerifyPKCS1v15(publicKey, crypto.SHA256, hasded, signText)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
var rootCertPool *x509.CertPool
|
|
|
|
func VerifyCert(cert *x509.Certificate) error {
|
|
//block, _ := pem.Decode([]byte(certPEM))
|
|
//if block == nil {
|
|
// return fmt.Errorf("failed to parse certificate PEM")
|
|
//}
|
|
//cert, err := x509.ParseCertificate(block.Bytes)
|
|
//if err != nil {
|
|
// return fmt.Errorf("failed to parse certificate: %v", err.Error())
|
|
//}
|
|
|
|
opts := x509.VerifyOptions{
|
|
Roots: rootCertPool,
|
|
}
|
|
|
|
if _, err := cert.Verify(opts); err != nil {
|
|
return fmt.Errorf("failed to verify certificate: %v", err.Error())
|
|
}
|
|
|
|
return nil
|
|
}
|