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
+14 -13
View File
@@ -70,20 +70,21 @@ func Run(resources EmbeddedResources) error {
logger.Init()
netproxy.InstallDefaultTransport()
embeddedCACertPEM := certs.EmbeddedCACertPEM()
logEmbeddedCAInfo(embeddedCACertPEM)
certManager, err := certs.NewEmbeddedManager()
if err := appdata.EnsureAssistantHome(); err != nil {
return err
}
certManager, caCertPEM, err := certs.LoadOrCreateManager(appdata.CACertFilePath(), appdata.CAKeyFilePath())
if err != nil {
return err
}
logCAInfo(caCertPEM)
defaultBackendBaseURL := "http://" + serverconfig.DefaultBackendListenAddr
proxyServer, err := mitm.NewProxyServer(serverconfig.DefaultProxyListenAddr, defaultBackendBaseURL, "", "", certManager)
if err != nil {
return err
}
proxyService := bridge.NewProxyService(proxyServer, certManager, embeddedCACertPEM)
proxyService := bridge.NewProxyService(proxyServer, certManager, caCertPEM)
adAssetBaseURL := defaultBackendBaseURL
if cfg, err := proxyService.LoadUserConfig(); err == nil {
adAssetBaseURL = browserReachableLoopbackBaseURL(cfg.BackendListenAddr)
@@ -442,20 +443,20 @@ func browserReachableLoopbackBaseURL(listenAddr string) string {
return "http://" + net.JoinHostPort(host, port)
}
// logEmbeddedCAInfo 用于处理与 logEmbeddedCAInfo 相关的逻辑
func logEmbeddedCAInfo(certPEM []byte) {
// logCAInfo 记录当前安装专属 CA 的公开信息
func logCAInfo(certPEM []byte) {
if len(certPEM) == 0 {
logger.Errorf("embedded CA is empty")
logger.Errorf("installation CA is empty")
return
}
cert, err := parseEmbeddedCert(certPEM)
cert, err := parseCert(certPEM)
if err != nil {
logger.Errorf("parse embedded CA failed: %v", err)
logger.Errorf("parse installation CA failed: %v", err)
return
}
sum := sha256.Sum256(cert.Raw)
logger.Infof(
"embedded CA loaded: sha256=%s subject=%s valid=%s~%s",
"installation CA loaded: sha256=%s subject=%s valid=%s~%s",
strings.ToUpper(hex.EncodeToString(sum[:])),
cert.Subject.String(),
cert.NotBefore.Format(time.RFC3339),
@@ -463,8 +464,8 @@ func logEmbeddedCAInfo(certPEM []byte) {
)
}
// parseEmbeddedCert 用于处理与 parseEmbeddedCert 相关的逻辑
func parseEmbeddedCert(data []byte) (*x509.Certificate, error) {
// parseCert 解析 DER 或 PEM 编码的证书
func parseCert(data []byte) (*x509.Certificate, error) {
if block, _ := pem.Decode(data); block != nil {
return x509.ParseCertificate(block.Bytes)
}