mirror of
https://gitee.com/mirrors/AllinSSL.git
synced 2026-03-15 10:52:01 +08:00
下载证书附带pfx
ssh部署兼容带密码的密钥登录 ssh部署日志新增标准和错误输出
This commit is contained in:
@@ -12,6 +12,8 @@ import (
|
||||
"encoding/pem"
|
||||
"errors"
|
||||
"fmt"
|
||||
"software.sslmate.com/src/go-pkcs12"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
@@ -138,3 +140,47 @@ func GetSHA256(certStr string) (string, error) {
|
||||
sha256Hash := sha256.Sum256(cert.Raw)
|
||||
return hex.EncodeToString(sha256Hash[:]), nil
|
||||
}
|
||||
|
||||
// PEMToPFX 将PEM格式的证书和私钥转换为PFX格式
|
||||
func PEMToPFX(certPEM, keyPEM, pfxPassword string) ([]byte, error) {
|
||||
// 使用默认密码如果未提供
|
||||
if pfxPassword == "" {
|
||||
pfxPassword = "allinssl"
|
||||
}
|
||||
|
||||
// 解析证书PEM
|
||||
certBlock, _ := pem.Decode([]byte(certPEM))
|
||||
if certBlock == nil || certBlock.Type != "CERTIFICATE" {
|
||||
return nil, fmt.Errorf("无效的证书PEM格式")
|
||||
}
|
||||
|
||||
// 解析私钥PEM
|
||||
keyBlock, _ := pem.Decode([]byte(keyPEM))
|
||||
if keyBlock == nil || (!strings.Contains(keyBlock.Type, "PRIVATE KEY")) {
|
||||
return nil, fmt.Errorf("无效的私钥PEM格式")
|
||||
}
|
||||
|
||||
// 解析X.509证书
|
||||
cert, err := x509.ParseCertificate(certBlock.Bytes)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("解析证书失败: %v", err)
|
||||
}
|
||||
|
||||
// 尝试解析私钥(PKCS8或PKCS1格式)
|
||||
var privKey interface{}
|
||||
privKey, err = x509.ParsePKCS8PrivateKey(keyBlock.Bytes)
|
||||
if err != nil {
|
||||
privKey, err = x509.ParsePKCS1PrivateKey(keyBlock.Bytes)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("解析私钥失败: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// 编码为PFX格式
|
||||
pfxData, err := pkcs12.Encode(rand.Reader, privKey, cert, nil, pfxPassword)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("编码PFX失败: %v", err)
|
||||
}
|
||||
|
||||
return pfxData, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user