From 784e8b9b2fe556f5641022d124449045cc8fb614 Mon Sep 17 00:00:00 2001 From: ZhuoQinghui <1302344380@qq.com> Date: Fri, 25 Oct 2024 11:21:55 +0800 Subject: [PATCH] =?UTF-8?q?pem=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.go | 56 ++++++++++++++++++++++++++++++++++++++-------- src/acme-client.go | 17 +++++++++----- src/command.go | 5 +---- src/daemon.go | 40 ++++++++++++++++++++++++++------- 4 files changed, 92 insertions(+), 26 deletions(-) diff --git a/main.go b/main.go index b6ec7ff..474ca41 100644 --- a/main.go +++ b/main.go @@ -2,16 +2,54 @@ package main import ( "acme-mana/src" + "crypto/x509" + "encoding/json" + "encoding/pem" + "github.com/go-acme/lego/v4/certificate" + "log" + "os" + "path" + "path/filepath" ) func main() { - //config := src.GetAppConfig() - //fmt.Println(config) - //src.Apply(config.Domains[0]) - //fmt.Println(os.Getwd()) - //err := os.MkdirAll("cert\\abc", 0777) - //if err != nil { - // fmt.Println(err) - //} - src.Start() + //src.Start() + testParseCert() +} + +func testParseCert() { + // 读取 + dir := src.GetAppConfig().CertDir + dir = filepath.Join(dir, "acme.zzzykj.cn") + certFile := path.Join(dir, "cert.crt") + certBytes, err := os.ReadFile(certFile) + if err != nil { + panic(err) + } + block, _ := pem.Decode(certBytes) + if block == nil { + log.Fatalf("Failed to decode PEM block") + return + } + + certParse, err := x509.ParseCertificate(block.Bytes) + if err != nil { + log.Fatalf("Failed to parse certificate: %v", err) + } + //info, err := json.Marshal(certParse) + //if err != nil { + // log.Fatalf("Failed to marshal certificate: %v", err) + //} + certInfo := src.CertInfo{ + Cert: certificate.Resource{}, + Info: *certParse, + } + info, err := json.Marshal(certInfo) + if err != nil { + log.Fatalf("Failed to marshal certificate: %v", err) + } + log.Println(string(info)) + + //log.Println(string(info)) + //log.Println(certParse) } diff --git a/src/acme-client.go b/src/acme-client.go index 70e22f4..0c45dfc 100644 --- a/src/acme-client.go +++ b/src/acme-client.go @@ -7,6 +7,7 @@ import ( "crypto/rand" "crypto/x509" "encoding/json" + "encoding/pem" "github.com/go-acme/lego/v4/certificate" "github.com/go-acme/lego/v4/lego" "github.com/go-acme/lego/v4/log" @@ -89,7 +90,7 @@ func saveCertFile(cert *certificate.Resource, name string) { dir = filepath.Join(dir, name) _, err := os.Stat(dir) if os.IsNotExist(err) { - err := os.MkdirAll(dir, 0644) + err := os.MkdirAll(dir, 0755) if err != nil { log.Infof("创建目录 %s 失败", dir) log.Fatal(err) @@ -97,18 +98,24 @@ func saveCertFile(cert *certificate.Resource, name string) { log.Infof("创建目录 %s", dir) } - err = os.WriteFile(path.Join(dir, "cert.crt"), cert.Certificate, 0644) + certBytes := cert.Certificate + err = os.WriteFile(path.Join(dir, "cert.crt"), certBytes, 0755) if err != nil { log.Fatalf("Failed to save certificate: %v", err) } - err = os.WriteFile(path.Join(dir, "cert.key"), cert.PrivateKey, 0644) + err = os.WriteFile(path.Join(dir, "cert.key"), cert.PrivateKey, 0755) if err != nil { log.Fatalf("Failed to save private key: %v", err) } - // 获取 cert 的过期时间 - certParse, err := x509.ParseCertificate(cert.Certificate) + block, _ := pem.Decode(certBytes) + if block == nil { + log.Fatalf("Failed to decode PEM block") + return + } + + certParse, err := x509.ParseCertificate(block.Bytes) if err != nil { log.Fatalf("Failed to parse certificate: %v", err) } diff --git a/src/command.go b/src/command.go index 41a9262..4c2746f 100644 --- a/src/command.go +++ b/src/command.go @@ -6,10 +6,7 @@ import ( "os" ) -/* -* -初始化Socket -*/ +// InitSocket /* func InitSocket() { log.Println("Start listen command") // 删除旧的 socket 文件 diff --git a/src/daemon.go b/src/daemon.go index a623295..f329d29 100644 --- a/src/daemon.go +++ b/src/daemon.go @@ -34,6 +34,10 @@ func Start() { daemonStatus() case "dump": dumpConfig() + case "domains": + showDomains() + case "apply": + applyOnce() case "-s": daemonCommand() default: @@ -79,14 +83,14 @@ func daemonStart() { return } - path, err := os.Executable() + workPath, err := os.Executable() if err != nil { log.Fatalf("Failed to get executable path: %v", err) } cmd := exec.Cmd{ - Path: path, + Path: workPath, Args: os.Args, - Dir: filepath.Dir(path), + Dir: filepath.Dir(workPath), Env: append(os.Environ(), "GO_DAEMON=1"), //Stdin: os.Stdin, Stdout: stdout, @@ -97,11 +101,6 @@ func daemonStart() { SysProcAttr: &syscall.SysProcAttr{}, } - //cmd := exec.Command(os.Args[0]) - //cmd.Env = append(os.Environ(), "GO_DAEMON=1") - //cmd.Stdout = os.Stdout - //cmd.Stderr = os.Stderr - //cmd.SysProcAttr = &syscall.SysProcAttr{} log.Println("Starting daemon...") err = cmd.Start() if err != nil { @@ -166,6 +165,31 @@ func dumpConfig() { log.Println(string(config)) } +func applyOnce() { + if len(os.Args) < 3 { + log.Fatalf("Please enter domain name!") + } + name := os.Args[2] + if name == "" { + log.Fatalf("No domain specified!") + } + domain := GetAppConfig().FindDomain(name) + if domain == nil { + log.Fatalf("Domain not found: %s", name) + } + Apply(*domain) +} + +func showDomains() { + domains := GetAppConfig().Domains + // 格式化为json并打印 + config, err := json.MarshalIndent(domains, "", " ") + if err != nil { + log.Fatalf("Failed to marshal config: %v", err) + } + log.Println(string(config)) +} + /* 守护进程接收名称 */