设置接受的CA列表并忽略chai-http的SSL错误

我正在尝试用chai / chai-http编写我的节点代码的unit testing。 一切工作正常,直到我将我的服务器切换到HTTPS服务器,但由于我的证书是由公司内部的根签名和我使用的证书的通用名称不匹配本地主机,chai是在我的请求上抛出一个错误。

我想要做以下事情:

  1. 忽略与域名validation相关的SSL错误。

  2. 设置要检查的CA列表。 如果不能这样做,我只需跳过所有的客户端证书检查即可。

我的代码如下:

var chai = require('chai'); var chaiHttp = require('chai-http'); var https = require('https'); var fs = require('fs'); var server = require('../app.js'); chai.should(); chai.use(chaiHttp); https.globalAgent.options.ca = [ fs.readFileSync('./ssl/Root.cer'), ]; describe('Attachments', function () { it('should succeed when passed valid arguments', function (done) { chai.request(server) .get('/10881057300D0A4E8E8586542AA3626E41') .set('userId', 'user') .set('region', 'US') .end(function (err, res) { chai.assert(res); res.should.have.status(200); chai.assert(res.body); done(); }); }); it('should return error without userId header', function (done) { chai.request(server) .get('/10881057300D0A4E8E8586542AA3626E41') .end(function (err, res) { chai.assert(res); res.should.have.status(500); chai.assert(res.type == 'application/json'); done(); }); }); }); 

我得到以下堆栈跟踪:

  Uncaught AssertionError: Unspecified AssertionError at test\test.js:21:18 at Test.Request.callback (node_modules\superagent\lib\node\index.js:615:12 ) at ClientRequest.<anonymous> (node_modules\superagent\lib\node\index.js:56 7:10) at TLSSocket.socketErrorListener (_http_client.js:267:9) at emitErrorNT (net.js:1253:8) 

我在这里解决了这个build议。

我认为这是拒绝作为无效的TLS。 即使我没有使用一个无效的证书,我认为它正在改变有效证书的URL到本地或parsing到一个IP地址,而不是与我正在使用的证书的FQDN的地址。 在第一个“describe()”之前添加下面的代码来修复它。

 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; 

以下是完整的testing代码:

 var chai = require('chai'); var chaiHttp = require('chai-http'); var server = require('../server'); var should = chai.should(); chai.use(chaiHttp); // This line allows use with https process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; describe('Auth', function() { it('should return 401 with invalid credentials', function(done){ chai.request(server) .post('/api/v1/user/authenticate') .send({"email":"badaccount@somedomain.com", "password": "password"}) .end(function(err, res) { res.should.have.status(401); done(); }); }); });