2010-11-23 138 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