52 lines
1.1 KiB
Go
52 lines
1.1 KiB
Go
|
package utils
|
||
|
|
||
|
import (
|
||
|
"crypto/x509"
|
||
|
"encoding/pem"
|
||
|
"fmt"
|
||
|
"io/ioutil"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
// 从证书文件中提取公钥
|
||
|
func getPublicKey(certPath string) (string, error) {
|
||
|
// 读取证书文件内容
|
||
|
certData, err := ioutil.ReadFile(certPath)
|
||
|
if err != nil {
|
||
|
return "", fmt.Errorf("failed to read certificate file: %w", err)
|
||
|
}
|
||
|
|
||
|
// 解码 PEM 编码的证书
|
||
|
block, _ := pem.Decode(certData)
|
||
|
if block == nil {
|
||
|
return "", fmt.Errorf("failed to decode PEM block")
|
||
|
}
|
||
|
|
||
|
// 解析证书
|
||
|
cert, err := x509.ParseCertificate(block.Bytes)
|
||
|
if err != nil {
|
||
|
return "", fmt.Errorf("failed to parse certificate: %w", err)
|
||
|
}
|
||
|
|
||
|
// 获取公钥
|
||
|
pubKey := cert.PublicKey
|
||
|
|
||
|
// 转换公钥为 PEM 格式
|
||
|
pubKeyBytes, err := x509.MarshalPKIXPublicKey(pubKey)
|
||
|
if err != nil {
|
||
|
return "", fmt.Errorf("failed to marshal public key: %w", err)
|
||
|
}
|
||
|
|
||
|
// 创建 PEM 块
|
||
|
pemBlock := &pem.Block{
|
||
|
Type: "PUBLIC KEY",
|
||
|
Bytes: pubKeyBytes,
|
||
|
}
|
||
|
|
||
|
// 编码为 PEM 格式字符串
|
||
|
pemBytes := pem.EncodeToMemory(pemBlock)
|
||
|
publicKey := strings.TrimSpace(string(pemBytes))
|
||
|
|
||
|
return publicKey, nil
|
||
|
}
|