相关疑难解决方法(0)

如何在非阻塞套接字上处理OpenSSL SSL_ERROR_WANT_READ/WANT_WRITE

OpenSSL库允许使用SSL_read从底层套接字读取并使用SSL_write写入它.这些函数可能会返回SSL_ERROR_WANT_READ或SSL_ERROR_WANT_WRITE,具体取决于它们的ssl协议需求(例如,重新协商连接时).

我真的不明白API要求我对这些结果做些什么.

对接受客户端连接的服务器应用程序进行映像,设置新的ssl会话,使底层套接字无阻塞,然后将filedescriptor添加到select/poll/epoll循环.

如果客户端发送数据,主循环将把它发送到ssl_read.如果返回SSL_ERROR_WANT_READ或SSL_ERROR_WANT_WRITE,必须在此处执行什么操作?WANT_READ可能很简单,因为下一个主循环迭代可能只会导致另一个ssl_read.但是如果ssl_read返回WANT_WRITE,应该调用哪些参数?为什么图书馆不发出呼叫呢?

如果服务器想要向客户端发送一些数据,它将使用ssl_write.同样,如果返回WANT_READ或WANT_WRITE,该怎么办?可以通过重复刚刚调用的同一个调用来回答WANT_WRITE吗?如果返回WANT_READ,是否应该返回主循环并让select/poll/epoll处理这个问题?但是首先应该写的信息呢?

或者应该在写入失败后立即完成读取?那么,当真正的解析器位于主循环中时,什么可以防止从应用程序协议中读取字节,然后在应用程序的郊区某处处理它?

sockets linux openssl

37
推荐指数
3
解决办法
3万
查看次数

如何确保Ruby使用不易受Heartbleed攻击的OpenSSL?

关于Heartbleed错误,ruby-lang.org上的这篇文章描述了如何检查漏洞和升级.

它包括这个建议:


要验证链接到Ruby的OpenSSL库的哪个版本,请使用以下命令:

ruby -v -ropenssl -rfiddle -e 'puts Fiddle::Function.new(Fiddle.dlopen(nil)["SSLeay_version"], [Fiddle::TYPE_INT], Fiddle::TYPE_VOIDP).call(0)'
Run Code Online (Sandbox Code Playgroud)

要验证当前使用Ruby安装的OpenSSL的版本,请使用以下命令:

ruby -ropenssl -e 'puts OpenSSL::OPENSSL_VERSION'
Run Code Online (Sandbox Code Playgroud)

这两个检查之间有什么区别,如果从任一命令返回错误版本,建议采取什么操作?

ruby openssl heartbleed-bug

20
推荐指数
2
解决办法
1万
查看次数

标签 统计

openssl ×2

heartbleed-bug ×1

linux ×1

ruby ×1

sockets ×1