2012-09-25 1 views
16

私はEventMachineに基づいて簡単なFTPSサーバーをプログラムしようとしています。tls_startが実行された場合、EventMachineはclose_connectionでclose_notifyを発行しますか?

制御ソケットが正しく機能します。データ転送にデータソケットを使用すると、すべてうまくいくように見えます(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はまた、私はは、close_notifyがで発行されていないため、この動作がある疑いがウェブ上で見つけたものとは多少異なる

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

がエラーを発行接続の終わり?もしそうなら、そのための既知のRubyベースのソリューションがありますか?(OpenSSL :: SSL :: SSLSocketを使用しているf.ex.)

+0

**恥知らずなプラグ警告:** [Foxbat](https://github.com/m0wfo/foxbat)は、JRubyを使用している場合にSSLエンジンの初期化とクリーンアップを管理します:) –

+0

これまでに動作しましたか?私は、コントロールソケットのstart_tlsを使用することができますが、データソケット上でクライアント(filezilla)を使用すると、常に悪いハンドシェイクについて文句を言う... :( – gucki

+0

いいえ、私はそれが可能であることを疑う –

答えて

0

回答は非常に短いです:いいえ、tls_startが実行された場合、EventMachineはclose_connectionでclose_notifyを発行しません。

0

私は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 
関連する問題