【问题标题】:What should be called for re-negotiation in SSL_Read/SSL_Write在 SSL_Read/SSL_Write 中重新协商应该调用什么
【发布时间】:2016-06-04 10:33:29
【问题描述】:

我正在尝试将 OpenSSL 添加到 epoll 中,并且套接字处于非阻塞模式。 一个令我困惑的问题是:SSL_read 可能会产生 SSL_ERROR_WANT_WRITESSL_write 可能会产生 SSL_ERROR_WANT_READ,因为 SSL 重新协商。

所以,我的问题是:

  1. 如果 SSL_read 产生SSL_ERROR_WANT_WRITE,我将套接字事件修改为EPOLLOUT。那么,当套接字稍后变为可写时,我应该调用什么,SSL_readSSL_write? (API 文档说必须重复相同的操作)

  2. 与问题(1)类似,案例为SSL_writeyieldSSL_ERROR_WANT_READ

  3. 如果SSL_read 产生SSL_ERROR_WANT_WRITE,接下来我可以调用SSL_send 发送数据吗? (TCP是全双工的,但是OpenSSL好像不能独立读写……)

  4. 与问题(3)类似,案例为SSL_writeyieldSSL_ERROR_WANT_READ

非常感谢!

【问题讨论】:

    标签: c tcp https openssl epoll


    【解决方案1】:

    您应该重新启动您正在尝试的 API。

    因此,如果SSL_read 发出WANT_WRITE,则在套接字准备好写入时再次调用SSL_readSSL_write 也是如此。

    OpenSSL documentation 仅声明您需要使用与发出阻塞通知时相同的参数重复调用。

    警告

    当由于 SSL_ERROR_WANT_READ 或 SSL_ERROR_WANT_WRITE 而必须重复 SSL_read() 操作时,必须使用相同的参数重复该操作。

    即使您想要全双工操作,如果当前操作被阻塞等待状态,那么您应该排队任何新操作,直到阻塞操作完成。这样,您将避免使用与触发阻塞通知的操作不同的操作进入 SSL 堆栈的潜在问题。

    【讨论】:

    • 谢谢~问题 3 和 4 怎么样:如果 SSL_read 产生 SSL_ERROR_WANT_WRITE 会发生什么,但我在旁边调用 SSL_write 来发送数据...
    • 它可能有效,也可能无效。并且,行为可能会因版本而异。因为,文档没有说明这一点。 WARNING 的使用似乎表明重要的是重新启动相同的操作,而不是启动新的操作。
    • 谢谢。其实我和你有同样的看法,但我不确定,所以在这里问这个问题。似乎最好的方法是深入了解源代码......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    相关资源
    最近更新 更多