Skip to content

[Bug] 系统代理环境变量与内置代理机制冲突 + fetchWebContent SSL证书问题(Windows) #49

@liaozaozao

Description

@liaozaozao

环境信息

  • 操作系统: Windows 11
  • Node.js 版本: v24.13.1
  • open-websearch 版本: 1.2.7(通过 npx open-websearch@latest
  • 运行模式: stdio
  • 代理: 本地代理端口 10808(同时支持 SOCKS5 和 HTTP CONNECT)

问题一:系统代理环境变量与 USE_PROXY 内置代理机制冲突

问题描述

当系统设置了 HTTP_PROXY / HTTPS_PROXY 环境变量时,即使配置了 USE_PROXY=true + PROXY_URL,axios 会同时通过两条路径走代理,导致所有请求失败(ECONNRESETsocket hang up503)。

复现步骤

  1. 系统环境变量设置了 HTTP_PROXY=http://127.0.0.1:10808HTTPS_PROXY=http://127.0.0.1:10808
  2. MCP 配置中设置 USE_PROXY=truePROXY_URL=http://127.0.0.1:10808
  3. 调用任何工具(search、fetchWebContent、fetchGithubReadme 等)均失败

原因分析

通过查看错误日志中的请求详情,发现 axios 通过 follow-redirects 处理代理时,请求对象显示:

hostname: '127.0.0.1',
port: '10808',
protocol: 'http:',
path: 'https://example.com/'

这说明 axios 自动读取了系统的 HTTP_PROXY / HTTPS_PROXY 环境变量,走了 axios 内部的代理路径(非 CONNECT 方法),而不是通过 HttpsProxyAgent(CONNECT 方法)。两种代理机制同时生效导致冲突。

即使设置 USE_PROXY=false,只要系统有 HTTP_PROXY / HTTPS_PROXY 环境变量,axios 仍然会自动走代理,导致请求行为不可控。

临时解决方案

在 MCP 配置的 env 中显式清空系统代理变量,让 open-websearch 只走 HttpsProxyAgent

{
  "env": {
    "MODE": "stdio",
    "USE_PROXY": "true",
    "PROXY_URL": "http://127.0.0.1:10808",
    "HTTP_PROXY": "",
    "HTTPS_PROXY": ""
  }
}

建议修复

在 open-websearch 内部的所有 axios 请求中,显式设置 proxy: false,防止 axios 自动读取系统环境变量,确保只走 HttpsProxyAgent 这一条代理路径。示例:

const requestOptions: any = {
  proxy: false,  // 禁止 axios 自动读取 HTTP_PROXY 等环境变量
};

if (effectiveProxyUrl) {
  const proxyAgent = new HttpsProxyAgent(effectiveProxyUrl);
  requestOptions.httpAgent = proxyAgent;
  requestOptions.httpsAgent = proxyAgent;
}

USE_PROXY=false 时,同样应设置 proxy: false,确保在任何环境下行为一致。


问题二:fetchWebContent 在 Windows 上存在 SSL 证书验证失败

问题描述

在 Windows 上调用 fetchWebContent 访问 HTTPS 网站时,返回错误:

unable to get local issuer certificate

其他工具(search、fetchGithubReadme、fetchJuejinArticle)在相同环境下均正常工作,唯独 fetchWebContent 出现此问题。

原因分析

Node.js 使用内置的 CA 证书库,不读取 Windows 系统证书库。fetchWebContent 访问任意 HTTPS 站点,更容易遇到证书链不完整的情况。其他工具访问的是固定域名(GitHub API、掘金 API 等),证书链完整所以没问题。

临时解决方案

设置环境变量 NODE_TLS_REJECT_UNAUTHORIZED=0 可以解决,但会降低安全性。

建议

考虑在文档中注明 Windows 用户可能需要配置 NODE_EXTRA_CA_CERTS 环境变量,或在 fetchWebContent 的请求中提供可选的忽略证书验证选项。


附加建议:README 文档补充

1. Windows 平台的 stdio 配置示例

README 中 NPX Command Line 配置示例使用 "command": "npx",但在 Windows 上需要通过 cmd /c 包装才能正常运行,建议补充 Windows 示例:

{
  "mcpServers": {
    "web-search": {
      "command": "cmd",
      "args": ["/c", "npx", "-y", "open-websearch@latest"],
      "env": {
        "MODE": "stdio",
        "DEFAULT_SEARCH_ENGINE": "bing",
        "SYSTEMROOT": "C:/Windows"
      }
    }
  }
}

2. 代理与系统环境变量冲突的说明

建议在文档的代理配置部分提醒用户:如果系统已设置 HTTP_PROXY / HTTPS_PROXY 环境变量,需要在 MCP 配置中显式清空这些变量,避免与内置代理机制冲突。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions