无论证书有效性如何,我的node.js https客户端始终有效

时间:2012-04-13 14:10:44

标签: javascript node.js https httpclient

此测试程序连接到https服务器并获取一些内容。我已经在浏览器和curl中检查了我的服务器,证书工作正常。如果我运行curl从服务器获取数据,它会正确地抱怨证书未知,除非我使用--cacert传递它或使用-k关闭安全性。

所以我遇到的问题是,虽然我认为我的客户端应该进行证书身份验证,而且我告诉它公共证书的位置,但它始终有效。如果我删除ca:选项,以便它不知道证书来自服务器,那么它默默地工作。我想抓住身份验证错误,但我似乎无法这样做。

var https = require('https');
var fs = require('fs');

function main() {

      var data = '';

      var get = https.get({
        path: '/',
        host: 'localhost',
        port: 8000,
        agent: false,
        ca: [ fs.readFileSync('https_simple/cacert.pem') ]

      }, function(x) {

        x.setEncoding('utf8');
        x.on('data', function(c) {data += c});
        x.on('error', function(e) {
          throw e;
        });
        x.on('end', function() {
          console.log('Hai!. Here is the response:');
          console.log(data);
        });

      });

      get.on('error', function(e) {throw e});

      get.end();

    }

main();

4 个答案:

答案 0 :(得分:10)

为了完成这项工作,我需要升级到v0.7.8(尽管任何v0.7应该没问题),其中rejectUnauthorized功能已添加到https.get

需要这些选项组合:

agent: false, // or you can supply your own agent, but if you don't you must set to false
rejectUnauthorized: true, 
ca: [ fs.readFileSync('https_simple/cacert.pem') ]

现在,如果身份验证失败,您将收到“错误”事件,请求将不会继续。

有关制作自己的代理

的详细信息,请参阅https.request documentation

错误修复已在此更改中提交:https://github.com/joyent/node/commit/f8c335d0

答案 1 :(得分:4)

根据https.request的{​​{3}},cahttps.get的{​​{1}}选项是来自documentation的选项。 https.request模块功能选项的文档说明:

  

tls.connect:一组字符串或受信任证书的缓冲区。如果是这样的话   省略了几个众所周知的“根”CA,就像VeriSign一样。   这些用于授权连接。

深入了解node.js源代码,可以在此处找到使用的根证书:tls.connect

因此,简而言之,由于ca模块没有提供权限证书,https.get模块将尝试使用根证书列表对连接进行身份验证。

答案 2 :(得分:2)

我使用request模块在​​npm中执行此操作。它是这样的:

var cacert = ... // in npm, this is a config setting
var request = require("request")
request.get({ url: "https://...",
              ca: cacert,
              strictSSL: true })
  .on("response", function (resp) { ... })
  .on("error", function (er) { ... })

如果ssl无效,将引发错误事件。

答案 3 :(得分:1)

在V 0.6.15中,无论证书验证是否通过,您都需要explicitly check

if (x.connection.authorized === false) {    
   console.log('SSL Authentication failed');
} else if (x.connection.authorized === true) {    
   console.log('SSL Authentication succeeded');
}