3

我正在尝试为 http3 设置一个测试环境,只是为了学习。

到目前为止我做了什么:

  • 使用 dns-01 创建了一个真正的让我们加密证书
  • 使用实验性 CUIC 标志编译 node.js
  • 支持 http3 的编译 curl

我创建了一个包含示例内容的脚本:

'use strict';

const key = getTLSKeySomehow();
const cert = getTLSCertSomehow();

const { createQuicSocket } = require('net');

// Create the QUIC UDP IPv4 socket bound to local IP port 1234
const socket = createQuicSocket({ endpoint: { port: 1234 } });

socket.on('session', async (session) => {
  // A new server side session has been created!

  // The peer opened a new stream!
  session.on('stream', (stream) => {
    // Let's say hello
    stream.end('Hello World');

    // Let's see what the peer has to say...
    stream.setEncoding('utf8');
    stream.on('data', console.log);
    stream.on('end', () => console.log('stream ended'));
  });

  const uni = await session.openStream({ halfOpen: true });
  uni.write('hi ');
  uni.end('from the server!');
});

// Tell the socket to operate as a server using the given
// key and certificate to secure new connections, using
// the fictional 'hello' application protocol.
(async function() {
  await socket.listen({ key, cert, alpn: 'h3-25' });
  console.log('The socket is listening for sessions!');
})();

只是为了未来的读者,这些功能getTLSKeySomehow()可以getTLSCertSomehow()替换为:

const fs = require("fs")
const key = fs.readFileSync('privkey.pem')
const cert = fs.readFileSync('cert.pem')

network.http.http3.enabled然后我尝试通过在 Firefox 中启用http3 并在about:config. 有了地址https://my.dev.domain.name:1234/,但这不起作用。

使用 curl 不起作用,可能值得注意的是我在 Windows 10 上使用 WSL。每次在 curl 上访问相同的 url 都会超时。只是为了检查我的设置是否正常:我可以验证 Firefox 和 curl 可以通过 http3 完美访问www.google.com 。

当我使用相同的密钥实现第二个 http2 端点时,它可以正常工作,没有任何证书警告。

如何调试我做错了什么?

4

1 回答 1

2

您的代码示例只是实现了 QUIC——它是 HTTP/3 下的传输协议(类似于 TCP + TLS 是 HTTP/1.1 下的传输协议)。

这意味着您需要额外的代码来在 Quic 之上实现 HTTP/3。理想情况下,您需要一个库,因为它相当复杂。以下是需要实施的规范的最新草案版本的链接:

我假设 node.js 最终也会增加对这些的支持,这样这个任务就会变得更容易。

如果没有 HTTP/3 支持,您可以针对您的测试服务器测试纯 QUIC 流(没有 HTTP 语义)。您可以使用任何各种 QUIC 库来执行此操作,但可能没有像 curl 这样的开箱即用 CLI 工具。

于 2021-01-07T06:53:45.053 回答