|
|
|
|
@ -6,6 +6,7 @@ import (
@@ -6,6 +6,7 @@ import (
|
|
|
|
|
"fmt" |
|
|
|
|
"os" |
|
|
|
|
"syscall" |
|
|
|
|
"unsafe" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
const ( |
|
|
|
|
@ -16,13 +17,22 @@ 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() {
@@ -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 {
@@ -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" |
|
|
|
|
} |