1

私の c++ アプリケーションでは、ネットワーク機能で open ssl を使用しています。ソケットに正常に接続した直後に、SSL_read: SSL_ERROR_SYS_CALL を使用する受信関数でエラーが発生することがわかりました。それが意味するものであるSSLドキュメントによると:

なんらかの I/O エラーが発生しました。OpenSSL エラー キューには、エラーに関する詳細情報が含まれている場合があります。エラーキューが空の場合 (つまり、ERR_get_error() が 0 を返す)、ret を使用してエラーの詳細を調べることができます: ret == 0 の場合、プロトコルに違反する EOF が観察されました。ret == -1 の場合、基になる BIO が I/O エラーを報告しました (Unix システムのソケット I/O については、errno を参照して詳細を確認してください)。

私の場合、ERR_get_error() は 0 と ret == 0 を返します。つまり、"

プロトコルに違反する EOF が観察されました。

それが何を意味するか知っていますか?理解できない。この問題を解決するには、何を確認または実行する必要がありますか?

ありがとう

4

2 に答える 2

1

レミーからの答えは正しいですが、それを明確にして少し拡張させてください。

SSL_do_handshake()SSL_connect()SSL_accept()、またはが 0 を返し、次の への呼び出しが返され、実際の値が 0 である状況はSSL_write()、適切な SSL シャットダウンなしで呼び出すなどして、ピアが TCP 接続を閉じたことを意味します。これは完全に正常で一般的な状況ですが、TLS/SSL に関しては適切な切断ではありません。そのため、SSL プロトコルに違反しているのは EOF です。SSL_read()SSL_shutdown()SSL_get_error()SSL_ERROR_SYSCALLerrnoclose()

于 2016-08-12T18:56:39.257 に答える
-1

これは、端で SSL を使用していないピア ソケットに接続したことを意味します。ソケットだけでは十分ではなく、すぐconnect()に呼び出しを開始しますSSL_read()。andを使用する前に、 SSL_connect()afterを呼び出しconnect()て SSL ハンドシェイクを実行する必要があります。また、正しいポートに接続していることを確認してください。一部のサーバーは、SSL 接続と非 SSL 接続に別々のポートを使用します。SSL_read()SSL_write()

于 2012-04-19T08:50:26.827 に答える