2014-01-30 105 views
0

我建立的一个安全端口443 ,而不是发送HTTP片段上坐着,我使用443通过发送我的自定义数据的TCP的NodeJS服务器。 它一切正常,直到有人试图导航到节点服务器的https地址。如何编写正确的HTTPS标头?

想问我怎么送,如果有人浏览到我的节点服务器的HTTPS地址404未找到HTTPS响应?

E.g:

if(isHTTPRequest) { 
    socket.write("HTTP/1.1 404 Not Found"); 
    return; 
} 

以上不起作用。

+1

你需要做完整的SSL握手。不知道它是否值得。 – Thilo

+0

OMGOMGOMGOMGOMG – user3252291

+0

请不要别想实现'HTTPS'你问这个问题的事实证明,你不知道有足够的了解安全就别想了。 (我不会让你失望......很少有人应该考虑实施安全系统)。 – Aron

回答

0

关于443号港口没有任何魔法;它本质上并不能保证安全。它在功能上与端口442,444,80或任何其他端口相同。 443的唯一特别之处在于按照惯例,HTTPS服务器在该端口上侦听。

,使HTTPS服务器的安全问题是他们实施TLS protocol。 TLS是一种为应用程序提供安全通信通道的加密协议。 TLS提供安全性;服务器然后在TLS通道上运行常规HTTP。

TLS并不仅仅局限于HTTP服务器。任何应用程序均可使用它;它的高级API提供的数据流就像普通的TCP流一样工作。

幸运的是,节点includes a complete TLS implementationnet模块提供的常规TCP流几乎完全API兼容。因此,而不是:

net.createServer(function(socket) { 
    socket.write('stuff that gets sent in the clear'); 
}); 

这样做:

tls.createServer({ 
    cert: fs.readFileSync('cert.pem'), // the pem-encoded certificate 
    key: fs.readFileSync('key.pem'), // the private key that goes with your cert 
    ca: [] // you may need to include the CA's intermediate certs if applicable 
}, function(socket) { 
    socket.write('stuff that will be encrypted'); 
}); 

同样,客户端使用tls.connect(),而不是net.connect()

generate你的私钥使用OpenSSL,然后提交CSR到Certificate Authority,谁会给你一个将被广泛接受的证书。您也可以自行签名,但自签名证书默认不会被客户接受。

最后,考虑到你正在写一个自定义的服务器(而不是HTTP服务器),你不应该在端口443上监听公约说,HTTPS服务器侦听端口443,和自定义的协议是不是HTTP 。选择一个不同的端口,最好是一个isn't already assigned

+0

谢谢乔希!我以前的设置是在运行NodeJS Net模块的一组EC2实例前的haproxy。Haproxy支持SSL,所以我推测通信是“安全的”,即使我运行的是Net模块。非常感谢指导!显然我需要阅读更多。我之所以想到使用443是因为我认为我可以轻松绕过企业防火墙。 – user3252291

+0

好的,如果你的服务器前面有一些haproxy实际上是在做SSL,那么这是一个不同的故事。在AWS中,如果负载平衡器和应用程序服务器之间的数据未加密,则可以。至于企业防火墙,是的,有些阻止连接不是80或443.但是,有些人甚至会基本上对HTTPS连接执行MITM攻击,所以您的非HTTP协议最终会被阻止。 – josh3736

+0

非常感谢Josh!欣赏漫长的答案! – user3252291

0

你可以让openssl客户端完成难题。查看他们的文档和示例。