2010-11-23 183 views
1

我試圖創建一個從node.js應用程序到本地託管的nginx服務器的基本SSL連接;它還涉及發送客戶的憑證。握手似乎是成功的,因爲在「安全」事件中調用「verifyPeer」可以驗證那麼多。但是,服務器繼續只響應400響應。node.js和nginx SSL握手失敗

如果我做在命令行上的捲曲相同的請求,我回到我的期望:

curl -v -E curl-test.crt --cacert ca.crt https://internal.url:7443/some.file 

「的捲翹test.crt」是通過連接客戶端密鑰和證書一起創建的。

這裏是得到一個故障所需的Node.js代碼最小位:

global.util = require('util'); 

var fs = require('fs'), 
    http = require('http'), 
    crypto = require('crypto'); 

var clientCert = fs.readFileSync("tmp/cert.crt", 'ascii'), 
    clientKey = fs.readFileSync("tmp/key.key", 'ascii'), 
    caCert = fs.readFileSync("tmp/ca.crt", 'ascii'); 
var credentials = crypto.createCredentials({"key": clientKey, "cert": clientCert, "ca": caCert}); 

var client = http.createClient(7443, "internal.url", true, credentials); 

client.addListener("secure", function() { 
    if (!client.verifyPeer()) { 
    throw new Exception("Could not verify peer"); 
    } 
}); 

var request = client.request('GET', '/some.file', {}); 

request.on('response', function(response) { 
    response.on('data', function(body) { 
    util.log("body: " + body); 
    }); 
}); 

request.end(); 

這裏是我得到的,不管什麼樣的反應「some.file」更改爲:

body: <html> 
<head><title>400 Bad Request</title></head> 
<body bgcolor="white"> 
<center><h1>400 Bad Request</h1></center> 
<hr><center>nginx/0.6.32</center> 
</body> 
</html> 

調試任何幫助或解決這一問題將是非常美妙

回答

4

您是否獲得在您的nginx錯誤日誌此消息?

2010/11/23 17:51:59 [info] 13221#0: *1 client sent HTTP/1.1 request without "Host" header while reading client request headers, client: 127.0.0.1, server: testme.local, request: "GET /some.file HTTP/1.1" 

如果是這樣,你可以通過簡單地將「主機」頭到您的GET請求,這樣解決它:

var request = client.request('GET', '/some.file', {'Host':'internal.url'}); 

貌似nginx的希望主機頭和節點不發送默認。可能有一種方法可以將nginx配置爲默認爲正確的頭部值。

希望有幫助!

+0

你是本週的男人!我沒有看到你在任何日誌文件中列出的錯誤消息(可能是日誌設置),但我嘗試了主機設置,而且確實有效。非常感謝你! – Gus 2010-11-24 17:40:34