2012-12-29 91 views
1

我在Node.js中創建了一個TLS服務器和一個合適的TLS客戶端。很明顯,他們都相互合作,但我想驗證一下。如何驗證連接實際上是否受TLS保護?

基本上,我想的東西,如檢查連接或手動連接到服務器並檢查它發送,或者類似的東西...

服務器的相關代碼:

var tlsOptions = { 
    key: fs.readFileSync('key.pem'), 
    cert: fs.readFileSync('server.pem') 
}; 

tls.createServer(tlsOptions, function (tlsConnection) { 
    var d = dnode({ 
    // [...] 
    }); 
    tlsConnection.pipe(d).pipe(tlsConnection); 
}).listen(3000); 

適當的客戶端代碼:

var d = dnode(); 
d.on('remote', function (remote) { 
    // [...] 
}); 

var tlsConnection = tls.connect({ 
    host: '192.168.178.31', 
    port: 3000 
}); 
tlsConnection.pipe(d).pipe(tlsConnection); 

我怎麼能這樣做呢?

+0

你會發布你的代碼的相關部分嗎? – halfer

+0

完成。基本上,它是通過TLS的dnode連接。 –

回答

3

Wireshark會告訴你數據是否是TLS加密的,但是它不會告訴你連接是否確實對抗中間人攻擊。爲此,您需要測試您的客戶端是否拒絕連接到提供未由可信CA簽名的證書的服務器,僅適用於其他主機名的證書,無效的證書,撤銷的證書......

如果您的server.pem不是來自真實/可信CA的證書,並且您的客戶端不拒絕連接到服務器(並且您沒有明確向客戶端提供server.pem),那麼您的客戶端很可能不安全。鑑於您連接的是IP,而不是主機名,所以沒有可信任的CA應該爲其頒發證書,所以我假設您使用自簽名證書並且容易受到攻擊。 connect() ing時,您可能需要指定rejectUnauthorized。 (Rant:由於這是一個很常見的錯誤,我認爲將默認設置爲不驗證是非常不負責任的。)

+0

感謝您的好解釋!有趣(好)的事情是:對於你所描述的應該測試的東西,實際上有單元測試:-)!關於自簽名證書的第二件事:現在它是一個自簽名證書,因爲代碼仍處於巨大的發展階段,但一旦我進一步深入,它將變成官方的代碼。無論如何:非常感謝您的幫助,這篇文章非常棒:-)! –

+1

請注意,自簽名證書在所有情況下都不錯。如果您將運行一臺中央服務器,並且客戶端(由您編寫)將獲取例如那裏的軟件更新,我會說運行自己的CA,並且只接受來自該CA的證書甚至會被首選,因爲它可以防止破損的CA危害應用程序的安全。您應該確保只接受*您的*自簽名/自簽發的證書 - 如果您的軟件與自簽名證書一起工作,儘管您沒有明確指定客戶端中的證書,則表示它會接受任何證書。 –

0

基本上,我想的東西,如檢查連接或手動連接到服務器並檢查它發送,或者類似的東西...

可以使用工具如Wireshark查看他們正在傳輸的數據。

+0

如果*實際上是TLS加密,我該如何識別*? –

+1

@GoloRoden Wireshark將顯示像TLS ClientHello,ServerHello,ChangeCipherSpec等消息 – EJP

+0

好的,我打算試一試... :-) –

相關問題