K6执行NTLM认证API负载测试时出现HTTP_1_1_REQUIRED错误的原因
问题原因与解决方案
这个错误的核心原因很明确:你的负载测试工具默认使用了HTTP/2协议,但NTLM认证机制并不兼容HTTP/2,而Kestrel虽然支持HTTP/1.1,但当客户端用HTTP/2发起需要NTLM认证的请求时,就会触发这个“要求使用HTTP/1.1”的错误。
为什么会这样?
NTLM是一个基于HTTP/1.1设计的认证方案,它依赖于HTTP/1.1的连接复用模型——认证流程需要在同一个TCP连接上完成多次请求交互。而HTTP/2的流机制和连接模型与HTTP/1.1完全不同,NTLM的认证逻辑无法在HTTP/2的流上正常工作。所以当Kestrel收到一个HTTP/2请求但需要NTLM认证时,就会返回这个错误,强制客户端切换到HTTP/1.1协议。
如何解决?
你需要在测试代码里强制指定使用HTTP/1.1协议,同时确保NTLM认证的配置正确。以你使用的工具(看起来是k6)为例,修改代码如下:
var url = 'https://localhost:xxxx/api/authorization/logon'; var payload = { }; var params = { headers: { 'Content-Type': 'application/json' }, http1: true, // 关键:强制使用HTTP/1.1 auth: { username: 'login', password: '*****', type: 'ntlm' // 明确指定NTLM认证类型 } }; // 注意参数顺序:k6的http.post是(url, body, params),原代码的参数顺序有误 let response = http.post(url, payload, params); check(response, { 'status is 200': (r) => r.status === 200 });
另外补充两个小细节:
- 尽量不要把用户名和密码放在URL里,通过
auth配置项传递更安全,也更符合工具的规范; - 确认你的Kestrel服务确实允许HTTP/1.1连接(默认情况下Kestrel会同时支持HTTP/1.1和HTTP/2,但NTLM会强制走HTTP/1.1)。
这样修改后,你的请求就会用HTTP/1.1发送,NTLM认证流程就能正常和Kestrel交互了。
内容的提问来源于stack exchange,提问作者Aleksander Parchomenko
相关产品推荐
相关产品推荐

