Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 设置接受的CA列表并使用http忽略SSL错误_Node.js_Ssl_Chai_Chai Http - Fatal编程技术网

Node.js 设置接受的CA列表并使用http忽略SSL错误

Node.js 设置接受的CA列表并使用http忽略SSL错误,node.js,ssl,chai,chai-http,Node.js,Ssl,Chai,Chai Http,我正试图用chai/chai-http为我的节点代码编写单元测试。在我将服务器切换到HTTPS服务器之前,一切都正常工作,但由于我的证书由内部公司根签名,并且我使用的证书的通用名称与localhost不匹配,chai在我的请求中抛出了一个错误 我想做以下几点: 忽略与域名验证相关的SSL错误 设置要检查的CA列表。如果不能做到这一点,我可以跳过所有客户端证书检查 我的代码如下: var chai = require('chai'); var chaiHttp = require('chai-ht

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

我想做以下几点:

  • 忽略与域名验证相关的SSL错误

  • 设置要检查的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)
    
    未捕获的断言错误:未指定的断言错误
    在test\test.js:21:18
    在Test.Request.callback(node\u modules\superagent\lib\node\index.js:615:12
    )
    在ClientRequest。(node\u modules\superagent\lib\node\index.js:56
    7:10)
    在TLSSocket.socketErrorListener(_http_client.js:267:9)
    在emitErrorNT(net.js:1253:8)
    
    我根据建议解决了这个问题

    我认为这是拒绝作为无效的TLS。尽管我的证书没有使用无效的证书,但我假设它正在将有效证书的url更改为localhost或解析为与我使用的证书的FQDN不关联的IP地址。在第一个“descripe()”之前添加以下代码为我修复了它

    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":"badaccount@somedomain.com", "password": "password"})
            .end(function(err, res) {
                res.should.have.status(401);
                done();
            });
        });
    
    
    });
    

    我也有同样的问题。你找到解决办法了吗?