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

2024-04-13

我正在尝试使用 chai/chai-http 为我的节点代码编写单元测试。一切都工作正常,直到我将服务器切换到 HTTPS 服务器,但由于我的证书是由内部公司根签名的,并且我使用的证书的通用名称与本地主机不匹配,所以 chai 在我的请求中抛出错误。

我想做以下事情:

  1. 忽略与域名验证相关的 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)

我按照建议解决了here https://github.com/visionmedia/supertest/issues/370.

我认为它会因为 TLS 无效而拒绝。尽管我的证书没有使用无效的证书,但我认为它正在将有效证书的 url 更改为 localhost 或解析为与我正在使用的证书的 FQDN 无关的 IP 地址。在第一个“describe()”之前添加以下代码为我解决了这个问题。

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

这是完整的测试代码:

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":"[email protected] /cdn-cgi/l/email-protection", "password": "password"})
        .end(function(err, res) {
            res.should.have.status(401);
            done();
        });
    });


});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 chai-http 设置接受的 CA 列表并忽略 SSL 错误 的相关文章

随机推荐