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

Deno+Oak网站遇400错误及握手未完成问题求助

问题

访问自建网站时收到400 Bad Request错误,提示“Your browser sent an invalid request”,服务器控制台报错:Http - error writing a body to connection: handshake not complete。

服务器代码如下:

import { Application} from "https://deno.land/x/oak@v12.1.0/mod.ts";
import { send } from "https://deno.land/x/oak@v11.1.0/send.ts";
import { viewEngine, ejsEngine, oakAdapter } from "https://deno.land/x/view_engine@v10.5.1/mod.ts";

import router from './routes.ts';

const port = Deno.env.get("PORT") || 4000

const app = new Application()

app.use(viewEngine(oakAdapter, ejsEngine));

app.use(router.routes());
app.use(router.allowedMethods());

app.use(async(ctx,next) => {
  await send(ctx,ctx.request.url.pathname,{
      root: `${Deno.cwd()}`
  });
  next();
});

try{
  console.log(`Server running on port ${port}`);
  await app.listen({port, certFile: "./sites/vainastar.com/vainastar.com-2023-03-27.crt", keyFile:"./sites/vainastar.com/vainastar.com-2023-03-27.key", alpnProtocols: ["h2", "http/1.1"],secure:true});
  
}catch(e) {
  console.log("there is an error");
  console.log(e);
}

已尝试添加alpnProtocols选项但问题未解决,打算清除浏览器缓存,怀疑问题与Deno及SSL证书有关,考虑使用请求代理或切换到Node.js。参考的相关讨论提到:Deno在处理SSL/TLS握手时存在部分兼容性问题,不少用户遇到过类似的握手未完成错误,涉及HTTP/2协议支持、证书链完整性等方面,部分用户通过更换证书、调整ALPN协议顺序或降级Deno版本解决了问题。

可能的原因与解决方案
  • 模块版本不匹配:代码里oak主版本是v12.1.0,但send模块用的是v11.1.0,版本差异可能导致内部逻辑冲突,引发握手异常。建议统一所有oak相关模块的版本,比如把send也升级到v12.x版本。

  • SSL证书异常:

    • 检查证书链完整性:确认crt文件包含完整的证书链(根证书+中间证书),部分CA颁发的证书需要拼接中间链才能被浏览器正常识别。
    • 验证证书有效性:用openssl x509 -in ./sites/vainastar.com/vainastar.com-2023-03-27.crt -text -noout命令查看证书的有效期、域名匹配度等信息,确保没有过期或域名不匹配的情况。
    • 更换测试证书:如果是自签名证书,要确保浏览器已信任该证书;如果是第三方证书,检查文件是否损坏,必要时重新下载证书。
  • 中间件执行顺序问题:send中间件放在路由之后,可能覆盖路由处理后的响应,干扰握手流程。建议调整顺序,把send放到路由之前,或者修改send逻辑,只有当文件不存在时才执行后续中间件:

    app.use(async(ctx,next) => {
      try {
        await send(ctx, ctx.request.url.pathname, { root: `${Deno.cwd()}` });
      } catch {
        await next();
      }
    });
    
  • HTTP/2兼容性问题:虽然配置了alpnProtocols,但部分浏览器或网络环境对HTTP/2支持不佳。可以尝试调整协议顺序为["http/1.1", "h2"],优先使用HTTP/1.1;或者暂时只保留["http/1.1"],测试是否解决问题。

  • Deno版本问题:相关讨论显示部分旧版Deno在SSL握手处理上存在bug,建议升级到最新稳定版,或者降级到已知无该问题的版本(比如v1.30.x系列)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:33:15