fix: generate a per-installation root CA

This commit is contained in:
leokun
2026-08-12 20:04:29 +08:00
parent 7a67e76617
commit 2b8d1c9e3d
14 changed files with 454 additions and 89 deletions
+34
View File
@@ -16,6 +16,7 @@ import (
const (
darwinSecurityExe = "security"
darwinLoginKeychainName = "login.keychain-db"
legacySharedCASHA1 = "C14B7488C5AB83F098BEB2603F1135595A381FC0"
)
func getCertSHA1Fingerprint(certPEM []byte) (string, error) {
@@ -36,7 +37,10 @@ func isCACertInstalled(certPEM []byte) (bool, error) {
if err != nil {
return false, fmt.Errorf("获取证书指纹失败: %w", err)
}
return isCACertFingerprintInstalled(fingerprint)
}
func isCACertFingerprintInstalled(fingerprint string) (bool, error) {
out, err := exec.Command(darwinSecurityExe, "find-certificate", "-a", "-Z", darwinLoginKeychainName).CombinedOutput()
if err != nil {
return false, fmt.Errorf("检查 macOS 登录钥匙串失败: %w: %s", err, strings.TrimSpace(string(out)))
@@ -50,6 +54,36 @@ func isCACertInstalled(certPEM []byte) (bool, error) {
return installed, nil
}
// EnsureLegacySharedCACertRemoved removes the compromised CA shipped by older versions.
func EnsureLegacySharedCACertRemoved() error {
installed, err := isCACertFingerprintInstalled(legacySharedCASHA1)
if err != nil {
return fmt.Errorf("检查旧版共享 CA 失败: %w", err)
}
if !installed {
return nil
}
out, err := exec.Command(
darwinSecurityExe,
"delete-certificate",
"-Z", legacySharedCASHA1,
"-t",
darwinLoginKeychainName,
).CombinedOutput()
if err != nil {
return fmt.Errorf("从 macOS 登录钥匙串删除旧版共享 CA 失败: %w: %s", err, strings.TrimSpace(string(out)))
}
installed, err = isCACertFingerprintInstalled(legacySharedCASHA1)
if err != nil {
return fmt.Errorf("验证旧版共享 CA 删除状态失败: %w", err)
}
if installed {
return fmt.Errorf("删除命令已执行,但 macOS 登录钥匙串中仍存在旧版共享 CA")
}
logger.Infof("ensureLegacySharedCACertRemoved: legacy shared CA removed from macOS login keychain")
return nil
}
func installCACertToDarwinKeychain(certPEM []byte, certPath string) error {
fingerprint, err := getCertSHA1Fingerprint(certPEM)
if err != nil {
+27
View File
@@ -20,6 +20,7 @@ const (
windowsCertutilExe = "certutil.exe"
windowsPowerShellExe = "powershell.exe"
windowsUserCancelCode = 1223
legacySharedCASHA1 = "C14B7488C5AB83F098BEB2603F1135595A381FC0"
)
// getCertThumbprint 获取证书的SHA1指纹,用于唯一标识证书
@@ -51,7 +52,10 @@ func isCACertInstalled(certPEM []byte) (bool, error) {
if err != nil {
return false, fmt.Errorf("获取证书指纹失败: %w", err)
}
return isCACertThumbprintInstalled(thumbprint)
}
func isCACertThumbprintInstalled(thumbprint string) (bool, error) {
cmd := exec.Command(windowsCertutilExe, "-verifystore", windowsRootStoreName, thumbprint)
cmd.SysProcAttr = hideWindow()
output, err := cmd.CombinedOutput()
@@ -76,6 +80,29 @@ func isCACertInstalled(certPEM []byte) (bool, error) {
return false, nil
}
// EnsureLegacySharedCACertRemoved removes the compromised CA shipped by older versions.
func EnsureLegacySharedCACertRemoved() error {
installed, err := isCACertThumbprintInstalled(legacySharedCASHA1)
if err != nil {
return fmt.Errorf("检查旧版共享 CA 失败: %w", err)
}
if !installed {
return nil
}
if err := runElevatedCertutil("-delstore", windowsRootStoreName, legacySharedCASHA1); err != nil {
return fmt.Errorf("从 Windows 系统信任存储删除旧版共享 CA 失败: %w", err)
}
installed, err = isCACertThumbprintInstalled(legacySharedCASHA1)
if err != nil {
return fmt.Errorf("验证旧版共享 CA 删除状态失败: %w", err)
}
if installed {
return fmt.Errorf("删除命令已执行,但 Windows 系统信任存储中仍存在旧版共享 CA")
}
logger.Infof("ensureLegacySharedCACertRemoved: legacy shared CA removed from Windows system store")
return nil
}
func quotePowerShellLiteral(value string) string {
return "'" + strings.ReplaceAll(value, "'", "''") + "'"
}
+5
View File
@@ -8,3 +8,8 @@ import "fmt"
func EnsureCACertInstalled(_ []byte, certPath string) error {
return fmt.Errorf("ensureCACertInstalled: 当前平台暂不支持,certPath=%s", certPath)
}
// EnsureLegacySharedCACertRemoved is a no-op on unsupported platforms.
func EnsureLegacySharedCACertRemoved() error {
return nil
}