2012-07-09 29 views
2

我正在嘗試在支持帶有顯式AUTH的TLS的Node中編寫一個FTP服務器。在這種模式下,客戶端向服務器發送一個AUTH TLS命令,服務器響應確認,提示客戶端開始協商安全連接。如何將套接字升級到節點中的TLS?

我使用此代碼升級連接:https://github.com/andris9/rai/blob/master/lib/starttls.js。我已經通過使用net.Server編寫了一個簡單的echo服務器,然後使用starttls函數立即將套接字升級到安全連接來驗證了這一點。按預期方式使用openssl s_client連接到此測試服務器。

[Error: 140735236446560:error:1408A0B7:SSL routines:SSL3_GET_CLIENT_HELLO:no ciphers  
specified:../deps/openssl/openssl/ssl/s3_srvr.c:1009: 
] 

我實際上已經指明:

然而,當我嘗試連接到使用FTP客戶端支持TLS使用顯式身份驗證我的測試FTP服務器,以下異常是由createSecurePair返回的對象募集密碼(createSecurePair通過options字典,ciphers設置爲'RC4-SHA:AES128-SHA:AES256-SHA')。我已經通過數據包嗅探了連接,而且似乎發生的情況是服務器響應客戶端的AUTH TLS命令後,客戶端和服務器之間有一個簡短的交換,我認爲這是(失敗的)TLS協商。但我對TLS進一步調查並不十分了解。我應該如何去調查這個錯誤的來源?

我正在運行節點0.8.1,並且與0.6.19有相同的問題。

+1

錯誤清楚地表明客戶端Hello中沒有發送密碼。您可以嘗試使用ethreal將數據包解碼爲SSL,並嘗試查看您發送的客戶端Hello數據包中是否存在密碼。 – Jay 2012-07-10 04:31:05

+0

這很奇怪,因爲我的程序是服務器,而不是客戶端,而且我嘗試過使用幾個FTP客戶端。似乎不太可能,他們都在這方面是越野車。 (除非TLS客戶端/服務器術語與我期望的不同?)感謝您的空靈建議。 – foldl 2012-07-10 12:37:46

+0

似乎FTP客戶端正在發送正確的客戶端Hello消息,但服務器從不以服務器Hello響應。所以在我的代碼中肯定有一個bug。只是很難弄清楚,因爲升級連接的代碼已知可以工作。 – foldl 2012-07-10 13:07:05

回答

1

事實證明,這只是一個愚蠢的錯誤。我正在修改的FTP服務器代碼使用socket.setEncoding。當然,有這個開啓了TLS談判。