我正在使用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
一样工作,因为您可以循环调用该函数,直到获得所需的结果(或致命错误...)
答案 0 :(得分:1)
您将需要使用匹配的逻辑注册generate_cookie
和verify_cookie
回调。其次,要注意DtlsListen中带有bug的OpenSSL版本1.1.0到1.1.1a。它仅会影响您是否正在使用插槽BIOS,但值得检查是否还会影响内存BIOS。