2014-01-30 87 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客戶端完成難題。查看他們的文檔和示例。