DTLSv1_listen从不验证ClientHello中的cookie

时间:2019-07-29 05:11:40

标签: openssl dtls

我正在使用C#在DTLS服务器上工作,希望专门使用内存BIO,以便利用.net中的简单异步套接字。

我的问题是DTLSv1_listen似乎无法区分一个clientHello 带有一个 cookie和一个没有。它将HelloVerifyRequest发送到所有ClientHello,无论如何。

也永远不会调用cookie回调。 (当然,生成cookie回调是

代码如下:

    var ssl = new Ssl(_ctx, new MemoryBio(), new MemoryBio());
    ssl.SetOptions(SslOptions.SSL_OP_COOKIE_EXCHANGE);

    rcv = await socket.ReceiveFromAsync(seg, SocketFlags.None, new IPEndPoint(IPAddress.Any, 0));
    ssl.ReadBio.Write(buf, rcv.ReceivedBytes);

    res = Ssl.DtlsListen(ssl, IntPtr.Zero);

    var bytesWritten = ssl.WriteBio.Read(buf, Ssl.TLS_MAX_RECORD_SIZE);
    await socket.SendToAsync(seg.Slice(0, bytesWritten), SocketFlags.None, rcv.RemoteEndPoint);

    rcv = await socket.ReceiveFromAsync(seg, SocketFlags.None, rcv.RemoteEndPoint);
    ssl.ReadBio.Write(buf, rcv.ReceivedBytes);

    res = Ssl.DtlsListen(ssl, IntPtr.Zero);
    ***Here, rather than calling the cooke verify callback, 
    ***it generates another cookie and prepares another HelloVerify

我意识到用C#代码示例询问OpenSSL问题有点不便,但我认为您可以从发生的事情中脱颖而出。

是否需要做些什么才能使DTLSv1_listen与内存BIOS配合工作?我认为它会像SSL_accept一样工作,因为您可以循环调用该函数,直到获得所需的结果(或致命错误...)

1 个答案:

答案 0 :(得分:1)

您将需要使用匹配的逻辑注册generate_cookieverify_cookie回调。其次,要注意DtlsListen中带有bug的OpenSSL版本1.1.0到1.1.1a。它仅会影响您是否正在使用插槽BIOS,但值得检查是否还会影响内存BIOS。