2012-09-25 45 views
16

Tôi đang cố gắng lập trình một máy chủ FTPS đơn giản dựa trên EventMachine.Sự cố EventMachine có đóng close_notify trên close_connection nếu tls_start được chạy không?

Ổ cắm điều khiển hoạt động bình thường. Khi sử dụng ổ cắm dữ liệu để truyền dữ liệu, có vẻ như mọi thứ hoạt động tốt (bắt tay TLS hoàn tất thành công và dữ liệu được nhận), nhưng sau đó tôi nhận được một thông báo lỗi. Dưới đây là những gì tôi nhận được trong 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 cũng phát hành một lỗi mặc dù hơi khác

--> 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 

Từ những gì tôi tìm thấy trên web tôi nghi ngờ hành vi này là vì close_notify không được cấp tại kết thúc kết nối? Nếu vậy, có bất kỳ giải pháp dựa trên Ruby đã biết nào không (f.ex. using OpenSSL :: SSL :: SSLSocket)?

+0

** Shameless plug cảnh báo: ** [Foxbat] (https://github.com/m0wfo/foxbat) quản lý khởi động và dọn dẹp công cụ SSL cho bạn nếu bạn đang sử dụng JRuby :) –

+0

Bạn đã bao giờ làm việc đó chưa? Tôi có thể sử dụng start_tls cho socket điều khiển, nhưng khi sử dụng nó trên socket dữ liệu, client (filezilla) luôn phàn nàn về việc bắt tay xấu ... :( – gucki

+0

không và tôi nghi ngờ rằng nó có thể –

Trả lời

0

Trả lời khá ngắn: không, EventMachine không phát hành close_notify trên close_connection nếu tls_start được chạy.

0

tôi thấy SSL 'tái mở' một kết nối sau khi đọc các CERT, vì vậy làm việc xung quanh ở đây là:

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 
Các vấn đề liên quan