2012-12-29 42 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

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