2

似乎令人惊讶地缺乏有关此过程如何工作的信息或文档,这使我很难确定我是否看到了正确的行为。我找到了 state_string() 调用,它给了我这样的字符串:

之前/连接初始化 SSLv3 读取服务器问候 A SSLv3 读取服务器证书 A SSLv3 读取服务器密钥交换 A SSLv3 读取完成 A

如果我不确定正确的顺序,这并不是特别有用。对我来说这看起来是对的,但问题是我用来推进这些状态的方法感觉是错误的。我在其他地方找到了这个代码片段:

while True:
    try:
        ssl_conn.do_handshake()
        break()
    except OpenSSL.SSL.WantReadError:
        pass

这是设置 OpenSSL 的正确方法吗?只需强制 do_handshake() 直到它停止抛出 WantReadError?

我还注意到,在此套接字上调用 shutdown() 和 close() 会发送 RST 而不是通常的 FIN、TCP 的 ACK。这是正确的行为吗?

谢谢你。

4

1 回答 1

1

为了将来参考,这似乎是强制握手的合适方式。我需要这样做的原因是因为我使用的接口恰好比直接连接要慢。在除了短暂的睡眠之外,我能够以最少的通话获得握手,并确认连接已建立,因为我可以发送数据。

至于我的第二个问题,答案是否定的,RST 不是正确的行为。这是由于我的配置导致我的中间人找不到要路由的服务器并抛出 RST。正确的行为是 TCP close() 的典型 FIN,ACKs。

于 2015-02-12T20:02:55.303 回答