询问一个仅存在nodejs环境的问题[已解决]

最终的问题找到了。

2024.04.01 14:06

!CAMELLIA node环境默认声明了禁用,狗东部分接口如果声明的禁用CAMELLIA套件就会出现该问题。

在朋友的帮助下成功找到问题。

是node环境下默认的ciphers算法套件的问题,可能京东部分api做了升级,对于部分算法套件做了特殊处理。可以根据抓包工具找到接口的tls算法做手动处理。最后感谢大家的帮助。

const axios = require('axios');
const qs = require('qs');
const https = require('https');

const agent = new https.Agent({
  ciphers: 'TLS_AES_256_GCM_SHA384',
});

let config = {
    ...
    httpsAgent: agent,
};

axios.request(config)
    .then((response) => {
        console.log(JSON.stringify(response.data));
    })
    .catch((error) => {
        console.log(error);
    });

因为有一个京东的脚本最近需要维护,然后我就看了一下。

昨天晚上大概花了半小时整理了算法,然后请求之后状态码是403,一直以为是算法出了问题,又花了三个多小时仔细核对整理了原始js。最后发现了一个奇怪的事情。

相同报文的情况下只有nodejs结果非正常,但是只要加一层代理(即使是透明的)他就正常了。

以下均为postman生成对应平台的代码,保证报文完全一样。

postman请求正常。

java okhttp3正常

python requests正常

nodejs axios 提示403

想要同学说可能是qs.string的问题,导致报文出错,然后加一下代理抓包看一下

然后正常了…

这是个什么问题。。。

该请求位于 京东试用列表

POST https://api.m.jd.com/client.action 请求

functionId为:try_SpecFeedList

在node环境以尝试got、axios、request,结果均在预期之外…

1 个赞

不太懂

1 个赞

请问h5st是怎么生成的

1 个赞

里面有h5st算法,但是现在问题是nodejs环境请求会出问题

1 个赞

dog东试用?

会不会是content-length头部的问题?我记得burp等工具会自动计算content-length,搜索了一下发现这篇文章 偶遇 Content-Length 和 Transfer-Encoding - 掘金 。提及 axios使用chunked发送request body ,或许是狗东服务器不支持chunked。不知道是个例还是axios某个策略。

不只是axios,got也不行

看看有没有可能是证书的问题 我记得node18 会强制校验https证书


:joy: 发现 gayhub 有人提了同样的问题


我又想出来另外一种可能。有没有可能是因为你没有指定的这些请求头,某个的默认值,狗东的服务器不能解析,因而返回403 ?如Accept-Encoding ,当有第三方透明proxy中转,这个值将由proxy解析并重新设置,从而响应200。
翻到了一个类似的案例:

这个事情很奇怪,仅在nodejs环境出现了

尝试后依然403

request包依然不行,现在nodejs环境已经尝试 got、axios、request,均出现预期外的结果。

另外我已经把这个奇怪的请求出处贴在了正文末尾。

证书问题是啥意思,因为接口是京东的,我在认知里面应该不会存在失效的情况 :thinking:

那真的太玄学了。nodejs所有库都不行,感觉应该真不是出在http数据包的构建上了,可能是nodejs ssl实现有什么诡异的地方。
按理说一个小小的狗东api,不应该专门ban掉node ssl握手指纹(不ban Python等其他),楼上说证书错误,感觉也不太可能,毕竟证书错误node会直接报错,但他返回403了。就是说ssl握手完成了,http请求包也发送出去了,http请求包也是符合规范的,但403。合理怀疑是不是狗东ban掉node的客户端指纹。 :joy:
昨天查文档,类似的问题有不少人提出,甚至proxy能200的状况也一模一样,但没有讨论出结论。有一篇文,有人提议用workers或者别的反代api,实现绕过某些api 在node 403的问题,最后要是查不出所以然,也只能像他们一样,反代凑合着用了。 :joy:

已经排除出来问题了,node环境默认的ciphers算法套件的问题

老板可以看下文章开头,已经找到解决方案了

具体是哪一个套件出了问题还没排除出来,但是问题和解决方案已经找到了

好的,学习了

话说京东服务器不支持加密套件,竟然是在响应包返回403。。我还以为会握手失败的。。这是符合HTTPS规范的行为,还是说只是京东中间件的大雷。。