Выдает ли EventMachine close_notify для close_connection, если был запущен tls_start?

Я пытаюсь запрограммировать простой сервер FTPS на основе EventMachine.

Контрольная розетка работает исправно. При использовании data socket для передачи данных вроде бы все работает хорошо (TLS рукопожатие успешно завершается и данные принимаются), но потом получаю сообщение об ошибке. Вот что я получаю в Filezilla:

Command:    LIST
Response:   150 Opening ASCII mode data connection for file list
Trace:  CFtpControlSocket::TransferParseResponse()
Trace:    code = 1
Trace:    state = 4
Trace:  CFtpControlSocket::SendNextCommand()
Trace:  CFtpControlSocket::TransferSend()
Trace:    state = 5
Trace:  CTransferSocket::OnConnect
Trace:  CTlsSocket::Handshake()
Trace:  gnutls_session_get_data on primary socket failed: -51
Trace:  CTlsSocket::ContinueHandshake()
Trace:  CTlsSocket::OnSend()
Trace:  CTlsSocket::OnSend()
Trace:  CTlsSocket::OnRead()
Trace:  CTlsSocket::ContinueHandshake()
Trace:  CTlsSocket::OnRead()
Trace:  CTlsSocket::ContinueHandshake()
Trace:  Handshake successful
Trace:  Cipher: AES-256-CBC, MAC: SHA1
Trace:  CTlsSocket::OnRead()
Trace:  CTransferSocket::OnConnect
Trace:  CTransferSocket::OnReceive(), m_transferMode=0
Listing:    -rwxrwxrwx 1 owner  group         1011 Dec 12 23:05 a.tmp
Trace:  CTlsSocket::Failure(-9, 0)
Error:  GnuTLS error -9: A TLS packet with unexpected length was received.
Status: Server did not properly shut down TLS connection
Error:  Could not read from transfer socket: ECONNABORTED - Connection aborted
Trace:  CTransferSocket::TransferEnd(3)
Trace:  CFtpControlSocket::OnReceive()
Response:   226 Closing data connection, sent 70 bytes
Trace:  CFtpControlSocket::TransferParseResponse()
Trace:    code = 2
Trace:    state = 5
Trace:  CFtpControlSocket::SendNextCommand()
Trace:  CFtpControlSocket::TransferSend()
Trace:    state = 8
Trace:  CFtpControlSocket::TransferEnd()
Trace:  CFtpControlSocket::ResetOperation(2)
Trace:  CControlSocket::ResetOperation(2)
Trace:  CFtpControlSocket::ParseSubcommandResult(2)
Trace:  CFtpControlSocket::ListSubcommandResult()
Trace:    state = 3
Trace:  CFtpControlSocket::ResetOperation(2)
Trace:  CControlSocket::ResetOperation(2)
Error:  Failed to retrieve directory listing
Trace:  CFileZillaEnginePrivate::ResetOperation(2)

ftp-ssl тоже выдает ошибку, но несколько иначе

--> LIST
150 Opening ASCII mode data connection for file list
===>START SSL connect on DATA
ftp: SSL_connect DATA error 0 - error:00000000:lib(0):func(0):reason(0)
226 Closing data connection, sent 70 bytes
421 Service not available, remote server has closed connection

Из того, что я нашел в Интернете, я подозреваю, что это поведение связано с тем, что close_notify не выдается в конце соединения? Если да, то есть ли для этого известное решение на основе Ruby (например, с использованием OpenSSL::SSL::SSLSocket)?


person Pavel K.    schedule 25.09.2012    source источник
comment
Предупреждение о бессовестном подключении: Foxbat управляет инициализацией и очисткой механизма SSL, если вы используете JRuby :)   -  person Chris Mowforth    schedule 26.09.2012
comment
Вы когда-нибудь заставляли его работать? Я могу использовать start_tls для сокета управления, но при использовании его для сокета данных клиент (filezilla) всегда жалуется на плохое рукопожатие... :(   -  person gucki    schedule 24.11.2012
comment
нет, и я сомневаюсь, что это возможно   -  person Pavel K.    schedule 25.11.2012


Ответы (2)


Ответ довольно короткий: нет, EventMachine не выдает close_notify на close_connection, если был запущен tls_start.

person Pavel K.    schedule 27.08.2013

Я обнаружил, что SSL «повторно открывает» соединение после прочтения сертификата, поэтому работа здесь такова:

def receive_data bitOfData
if (self.class isSomeSortOfTLSreadingClass && bitOfData.length == 1) then
 @headBuff << bitOfData
 return
 end
 # TLS connection closes on first byte, then re-opens.
end
person paradisaeidae    schedule 12.12.2013