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
|
|
}
|