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

Node.js使用request包调用FreeCodeCamp API遇SSL握手失败错误求助

解决FreeCodeCamp API调用的SSL握手失败问题

首先,你碰到的sslv3 alert handshake failure(SSL警报编号40)本质是客户端和服务器的TLS握手协商不匹配,大概率和证书配置、TLS版本或加密套件的设置有关。结合你提到wget加参数、Postman能正常访问的情况,我们可以从这几个方向调整代码来解决:

1. 修正URL与基础配置

你的BASE_URL存在两个小问题:

  • 缺少https://前缀:虽然指定了port 443,但完整的协议前缀能避免request的潜在解析异常
  • URL里的&是HTML转义字符,应该替换成实际的&

另外,你手动指定了ca: fs.readFileSync('./mycertfile.pem'),但Postman无需自定义证书就能访问,说明服务器的证书是受公共CA信任的,手动指定本地证书反而可能干扰验证流程,建议先移除这个配置。

2. 优化Agent配置

你当前设置的ciphers: 'ALL'包含很多过时或不安全的加密套件,服务器可能会拒绝这些套件的协商。我们可以换成更兼容的现代加密套件,或者直接简化配置,只保留必要的TLS版本设置。

修改后的代码示例

import request from 'request';

const BASE_URL = 'https://forum.freecodecamp.org/c/getting-a-developer-job.json?no_subcategories=false&page=1';

request.get(BASE_URL, {
  strictSSL: true, // 建议开启,仅在排查时临时关闭
  agentOptions: {
    secureProtocol: 'TLSv1_2_method',
    ciphers: 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384'
  }
})
.on('response', (response) => {
  console.log('Response status:', response.statusCode);
  console.log('Response headers:', response.headers);
})
.on('error', (err) => {
  console.log('error', err);
});

为什么wget和Postman能正常工作?

  • wget:你用--ca-certificate指定了正确的根证书,弥补了wget默认证书存储可能缺失对应CA的问题
  • Postman:默认使用系统级的证书存储,而系统已经信任了FreeCodeCamp服务器的证书颁发机构,所以无需额外配置

如果简化配置后还是失败,可以尝试暂时将strictSSL设为false(不建议长期使用,仅用于排查)。如果能成功,说明你的Node.js环境的根证书存储缺失对应CA,此时可以手动导入正确的根证书,或者将ca选项指向系统的根证书文件(比如Linux下的/etc/ssl/certs/ca-certificates.crt)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:45:01