You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为Vite配置证书:React+Golang本地开发环境问题排查

本地Vite+React+Golang开发环境证书配置问题

我正尝试为本地Vite开发服务器配置证书,客户端是React单页应用,后端为Golang。项目运行在WSL环境中,已Docker化。

Vite配置代码

import react from "@vitejs/plugin-react-swc";
import { defineConfig, UserConfigExport } from "vite";

export default defineConfig(() => {
  const config: UserConfigExport = {
    server: {
      port: 30330,
      https: {
        key: "../secrets/server.key.pem",
        cert: "../secrets/server.crt.pem",
      },
      proxy: {
        "/api": {
          target: "https://localhost:30331",
          changeOrigin: true,
          secure: false,
        },
      },
    },
    plugins: [react()],
  };

  return config;
});

Golang后端代码片段

cfg, err := config.LoadConfig()
if err != nil {
    utils.PrintRed(fmt.Sprintf("could not load config: %v", err))
    os.Exit(1)
}
// Load server certificate
cert, err := tls.LoadX509KeyPair("secrets/server.crt.pem", "secrets/server.key.pem")
if err != nil {
    log.Fatalf("Failed to load server cert: %v", err)
}

// Load and trust mkcert root CA
clientCAPool := x509.NewCertPool()
rootCA, err := os.ReadFile("secrets/rootCA.crt.pem") // Adjust path if needed
if err != nil {
    log.Fatalf("Failed to load root CA: %v", err)
}
clientCAPool.AppendCertsFromPEM(rootCA)

// HTTPS config with client cert verification
tlsConfig := &tls.Config{
    Certificates: []tls.Certificate{cert},
    ClientAuth:   tls.RequireAndVerifyClientCert,
    ClientCAs:    clientCAPool,
    MinVersion:   tls.VersionTLS12,
}

log.Printf("listening on port %s", cfg.Port)

server := &http.Server{
    Addr:      ":" + cfg.Port,
    TLSConfig: tlsConfig,
}

err = (server.ListenAndServeTLS("", ""))
utils.PrintRed(fmt.Sprintf("%v", err))

os.Exit(1)

问题现象

证书由mkcert生成,打开Web应用时未提示用户选择证书,服务器端报错:http: TLS handshake error from 172.19.0.1:51492: tls: client didn't provide a certificate,客户端的HTTPS API请求返回500且无响应体,服务器的请求处理器未被触发。

请问我遗漏了什么配置?


核心问题分析

你的Golang后端启用了tls.RequireAndVerifyClientCert,强制要求客户端提供经过验证的证书,但当前Vite代理和浏览器都没有配置客户端证书,导致TLS握手直接失败,请求根本无法到达后端处理器。

解决步骤

1. 生成客户端证书(使用mkcert)

执行以下命令生成客户端证书对:

mkcert -client localhost 127.0.0.1 ::1

将生成的localhost-client.pem和localhost-client-key.pem放到项目的secrets目录下。

2. 配置Vite代理的客户端证书

修改Vite配置中的proxy部分,添加客户端证书信息,让代理转发请求时携带证书:

proxy: {
  "/api": {
    target: "https://localhost:30331",
    changeOrigin: true,
    secure: false, // 本地自签证书跳过验证
    ssl: {
      key: "../secrets/localhost-client-key.pem",
      cert: "../secrets/localhost-client.pem",
    },
  },
},

3. 浏览器端配置(若直接访问后端API)

如果你的React应用直接调用后端API(不通过Vite代理),需要将客户端证书导入浏览器:

  • Chrome:设置 → 隐私和安全 → 安全 → 管理证书 → 「个人」标签页 → 导入生成的客户端证书和私钥
  • Firefox:选项 → 隐私与安全 → 证书 → 查看证书 → 「你的证书」 → 导入证书文件

4. 验证客户端证书与后端CA的兼容性

确保客户端证书由后端加载的rootCA.crt.pem签发,执行以下命令验证:

openssl verify -CAfile secrets/rootCA.crt.pem secrets/localhost-client.pem

输出OK则说明证书验证通过。

5. Docker环境路径校验

由于项目已Docker化,需确认:

  • 证书文件已正确挂载到容器内的对应路径
  • Vite和Golang配置中的证书路径是容器内部的路径,而非WSL主机路径

内容的提问来源于stack exchange,提问作者Emaborsa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 04:23:14