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

