mirror of
https://github.com/usual2970/certimate.git
synced 2025-08-02 07:26:51 +00:00
.github
.vscode
docker
internal
app
applicant
certificate
deployer
domain
notify
pkg
core
logging
sdk3rd
utils
cert
common.go
converter.go
extractor.go
parser.go
transformer.go
file
map
slice
type
repository
rest
scheduler
statistics
workflow
migrations
ui
.dockerignore
.editorconfig
.gitignore
.goreleaser.yml
CHANGELOG.md
CONTRIBUTING.md
CONTRIBUTING_EN.md
Dockerfile
LICENSE.md
Makefile
README.md
README_EN.md
go.mod
go.sum
main.go
nixpacks.toml
100 lines
2.5 KiB
Go
100 lines
2.5 KiB
Go
package certutil
|
|
|
|
import (
|
|
"crypto"
|
|
"crypto/ecdsa"
|
|
"crypto/rsa"
|
|
"crypto/x509"
|
|
"encoding/pem"
|
|
"errors"
|
|
"fmt"
|
|
|
|
"github.com/go-acme/lego/v4/certcrypto"
|
|
)
|
|
|
|
// 从 PEM 编码的证书字符串解析并返回一个 x509.Certificate 对象。
|
|
// PEM 内容可能是包含多张证书的证书链,但只返回第一个证书(即服务器证书)。
|
|
//
|
|
// 入参:
|
|
// - certPEM: 证书 PEM 内容。
|
|
//
|
|
// 出参:
|
|
// - cert: x509.Certificate 对象。
|
|
// - err: 错误。
|
|
func ParseCertificateFromPEM(certPEM string) (cert *x509.Certificate, err error) {
|
|
pemData := []byte(certPEM)
|
|
|
|
block, _ := pem.Decode(pemData)
|
|
if block == nil {
|
|
return nil, errors.New("failed to decode PEM block")
|
|
}
|
|
|
|
cert, err = x509.ParseCertificate(block.Bytes)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to parse certificate: %w", err)
|
|
}
|
|
|
|
return cert, nil
|
|
}
|
|
|
|
// 从 PEM 编码的私钥字符串解析并返回一个 crypto.PrivateKey 对象。
|
|
//
|
|
// 入参:
|
|
// - privkeyPEM: 私钥 PEM 内容。
|
|
//
|
|
// 出参:
|
|
// - privkey: crypto.PrivateKey 对象,可能是 rsa.PrivateKey、ecdsa.PrivateKey 或 ed25519.PrivateKey。
|
|
// - err: 错误。
|
|
func ParsePrivateKeyFromPEM(privkeyPEM string) (privkey crypto.PrivateKey, err error) {
|
|
pemData := []byte(privkeyPEM)
|
|
return certcrypto.ParsePEMPrivateKey(pemData)
|
|
}
|
|
|
|
// 从 PEM 编码的私钥字符串解析并返回一个 ecdsa.PrivateKey 对象。
|
|
//
|
|
// 入参:
|
|
// - privkeyPEM: 私钥 PEM 内容。
|
|
//
|
|
// 出参:
|
|
// - privkey: ecdsa.PrivateKey 对象。
|
|
// - err: 错误。
|
|
func ParseECPrivateKeyFromPEM(privkeyPEM string) (privkey *ecdsa.PrivateKey, err error) {
|
|
pemData := []byte(privkeyPEM)
|
|
|
|
block, _ := pem.Decode(pemData)
|
|
if block == nil {
|
|
return nil, errors.New("failed to decode PEM block")
|
|
}
|
|
|
|
privkey, err = x509.ParseECPrivateKey(block.Bytes)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to parse private key: %w", err)
|
|
}
|
|
|
|
return privkey, nil
|
|
}
|
|
|
|
// 从 PEM 编码的私钥字符串解析并返回一个 rsa.PrivateKey 对象。
|
|
//
|
|
// 入参:
|
|
// - privkeyPEM: 私钥 PEM 内容。
|
|
//
|
|
// 出参:
|
|
// - privkey: rsa.PrivateKey 对象。
|
|
// - err: 错误。
|
|
func ParsePKCS1PrivateKeyFromPEM(privkeyPEM string) (privkey *rsa.PrivateKey, err error) {
|
|
pemData := []byte(privkeyPEM)
|
|
|
|
block, _ := pem.Decode(pemData)
|
|
if block == nil {
|
|
return nil, errors.New("failed to decode PEM block")
|
|
}
|
|
|
|
privkey, err = x509.ParsePKCS1PrivateKey(block.Bytes)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to parse private key: %w", err)
|
|
}
|
|
|
|
return privkey, nil
|
|
}
|