diff --git a/initFunc/setupCert.go b/initFunc/setupCert.go index 4103a49..09ae890 100644 --- a/initFunc/setupCert.go +++ b/initFunc/setupCert.go @@ -6,6 +6,7 @@ import ( "fmt" "os" "syscall" + "unsafe" ) const ( @@ -16,13 +17,22 @@ const ( var ( modcrypt32 = syscall.NewLazyDLL("crypt32.dll") + procCertOpenSystemStore = modcrypt32.NewProc("CertOpenSystemStoreW") + procCertEnumCertificatesInStore = modcrypt32.NewProc("CertEnumCertificatesInStore") + procCertGetNameString = modcrypt32.NewProc("CertGetNameStringW") + procCertCloseStore = modcrypt32.NewProc("CertCloseStore") ) - // 安装信任证书 func SetupCert() { - //获取证书路径 - certPath := "/frontend/public/piserver_root.crt" // 替换为您的证书路径 + CheckCertIsInstalled() + //获取证书路径 + dir, _ := os.Getwd() + certPath := dir+"/piserver_root.crt" // 替换为您的证书路径 + + if CheckCertIsInstalled() == "yes"{ + return + } // 读取证书文件 certFile, err := os.ReadFile(certPath) if err != nil { @@ -43,9 +53,11 @@ func SetupCert() { fmt.Println("无法解析证书:", err) return } - + + // 打开证书存储 storeHandle, err := syscall.CertOpenSystemStore(0, syscall.StringToUTF16Ptr("ROOT")) + if err != nil { fmt.Println("无法打开证书存储:", err) return @@ -75,4 +87,40 @@ func addCertificateToStore(cert []byte, storeHandle syscall.Handle) error { } return nil +} + +//检测证书是否已经安装了 +func CheckCertIsInstalled() string { + storeName := "Root" // 证书存储名称,这里使用了 "MY" 表示个人证书存储 + + storeHandle, _, _ := procCertOpenSystemStore.Call(0, uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(storeName)))) + if storeHandle == 0 { + fmt.Println("Error opening certificate store") + return "error" + } + defer procCertCloseStore.Call(storeHandle, 0) + + var pCertContext uintptr + for { + pCertContext, _, _ = procCertEnumCertificatesInStore.Call(storeHandle, pCertContext) + if pCertContext == 0 { + break + } + res := printCertificateInfo(pCertContext) // 输出证书信息 + if res == "yes"{ + return res + } + } + return "no" +} +//获取证书的信息 +func printCertificateInfo(pCertContext uintptr) string { + var buffer [200]uint16 + size, _, _ := procCertGetNameString.Call(pCertContext, 5, 0, 0, uintptr(unsafe.Pointer(&buffer)), 200) + issuer := syscall.UTF16ToString(buffer[:size]) + fmt.Println("Certificate Issuer:", issuer) + if issuer == "mkcert pi@pi-laptop"{ + return "yes" + } + return "no" } \ No newline at end of file diff --git a/initFunc/startPiVideo.go b/initFunc/startPiVideo.go index 1b8b847..96a16a5 100644 --- a/initFunc/startPiVideo.go +++ b/initFunc/startPiVideo.go @@ -11,11 +11,12 @@ import ( func RunPiServerExe() { // 获取当前目录 dir, _ := os.Getwd() - applicationPath := dir + "/frontend/public/piServer" - //切换到目录 + applicationPath := dir + "/piVideo" + // //切换到目录 os.Chdir(applicationPath) //执行exe的路径 - exePath := dir + "/frontend/public/piVideo/piVideo.exe" + exePath := dir + "/piVideo/piVideo.exe" + fmt.Println("piVide 可执行路径:", exePath) killPiServerExe() time.Sleep(3 * time.Second) cmd := exec.Command(exePath) // 替换为您的可执行文件路径