node.js和nginx SSL握手失败

node.js和nginx SSL握手失败,nginx,node.js,Nginx,Node.js,我正在尝试创建一个从node.js应用程序到本地托管的nginx服务器的基本SSL连接;它还包括发送客户端的凭据。握手似乎是成功的,因为从“安全”事件中调用“verifyPeer”验证了这一点。但是,服务器继续响应,只有400响应 如果我在命令行上使用curl发出相同的请求,我会得到预期的结果: curl -v -E curl-test.crt --cacert ca.crt https://internal.url:7443/some.file “curl test.crt”是通过将客户机密

我正在尝试创建一个从node.js应用程序到本地托管的nginx服务器的基本SSL连接;它还包括发送客户端的凭据。握手似乎是成功的,因为从“安全”事件中调用“verifyPeer”验证了这一点。但是,服务器继续响应,只有400响应

如果我在命令行上使用curl发出相同的请求,我会得到预期的结果:

curl -v -E curl-test.crt --cacert ca.crt https://internal.url:7443/some.file
“curl 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>
正文:
400错误请求
400错误请求

nginx/0.6.32

调试或解决此问题的任何帮助都将非常有用

您是否在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配置为默认的正确头值


希望有帮助

您是否在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配置为默认的正确头值


希望有帮助

你是本周的风云人物!我没有在任何日志文件(可能是日志设置)中看到您列出的错误消息,但我尝试了主机设置,这确实起到了作用。非常感谢你!你是本周的风云人物!我没有在任何日志文件(可能是日志设置)中看到您列出的错误消息,但我尝试了主机设置,这确实起到了作用。非常感谢你!