在Node中使用http-proxy时的UNABLE_TO_VERIFY_LEAF_SIGNATURE

时间:2017-04-13 14:58:41

标签: node.js http-proxy self-signed

所有

我正在尝试创建一个简单的代理,将所有请求verbatum转发到另一台服务器。要做到这一点,我正在使用“http-proxy”npm。我想从本地转到云服务器。首先,当我设置http代理时,我看到一个错误“无法验证第一个证书”。经过一些网上研究,我发现这可能与我有自签名证书有关。因为它是自签名的,所以它不在证书库中,因此无法验证。但是,因为我在开发过程中不需要这个,所以我添加了“secure:false”来忽略证书验证。我知道这对生产来说是不安全的,但我现在只是试图解决这个问题。此更新实际上解决了此错误。

现在,我收到另一个错误“UNABLE_TO_VERIFY_LEAF_SIGNATURE”。

任何人都可以帮我弄清楚如何摆脱这个错误吗?我试过添加这个:     process.env ['NODE_TLS_REJECT_UNAUTHORIZED'] ='0'

但仍然显示错误。我看到http-proxy发出的事件中的错误(请参阅下面的代码以了解此事件)。如果我向下钻取'proxyRes',我可以在proxyRes中看到这个错误 - >连接 - > authorizationError - > UNABLE_TO_VERIFY_LEAF_SIGNATURE

以下是我的代码:

'use strict'
require('dotenv').config({silent: true})
var util = require('util');
const loggerFactory = require('./utils/logger')
const express = require('express')
const defaultRouter = require('./routes/default')
var logger = loggerFactory.consoleLogger
const proxy = require('http-proxy');

module.exports = (config) => {
const app = express()
// app.use(loggerFactory.requestLogger())
app.set('json spaces', 2)
app.set('port', config.express.port)

app.use('', defaultRouter)

process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0'
var apiProxy = proxy.createProxyServer({});
var proxyUrl = process.env.HOMEINSPECTIONSERVER_URL;

app.use((req,res,next) => {
apiProxy.web(req, res,
    {
      target: proxyUrl,
      secure: false,
    }
);

apiProxy.on('error', function(e) {
  logger.error("Error during proxy call!")
  logger.error("This is the error : " + e)
  next('route')
});

apiProxy.on('proxyReq', function(proxyReq, req, res, options) {
  logger.info("---REQUEST---")
  console.log("---REQUEST---")
  // logger.info(util.inspect(proxyReq))
   proxyReq.setHeader('X-Special-Proxy-Header', 'foobar');
});

apiProxy.on('proxyRes', function (proxyRes, req, res) {
  // logger.info("---RESPONSE---")
  // logger.info(util.inspect(proxyRes))
  // logger.info("---RESPONSEEND---")
  logger.info('RAW Response from the target', 
JSON.stringify(proxyRes.headers, true, 2));
});

apiProxy.on('open', function (proxySocket) {
  proxySocket.on('data', hybiParseAndLogMessage);
});

apiProxy.on('close', function (res, socket, head) {
  console.log('Client disconnected');
});

apiProxy.on('start', function (req, res, target) {
  // console.log('Started Request!');
});
})

app.use((req, res) => {
// logger.info('starting request...')
res.json(res.locals.standardResponse)
})
app.use((err, req, res, next) => {
var statusCode = 500

if (res.locals.standardResponse) {
  res.locals.standardResponse.error = err
  statusCode = err.statusCode || 600
  logger.error(err)
  res.status(statusCode).json(res.locals.standardResponse)
}

if (err.error !== undefined && err.error.httpStatus !== undefined) {
  statusCode = err.error.httpStatus
} else {
  statusCode = err.statusCode || 600
}

logger.error(err)
res.status(statusCode).json(res.body)
})

return app

}

2 个答案:

答案 0 :(得分:0)

对于任何一个也有上述问题的人。我通过使用名为express-http-proxy的npm包解决了这个问题。你可以在这里得到它:

enter link description here

所以我的代码现在看起来像这样:

'use strict'
require('dotenv').config({silent: true})
const loggerFactory = require('./utils/logger')
const express = require('express')
const defaultRouter = require('./routes/default')
var logger = loggerFactory.consoleLogger

module.exports = (config) => {
  process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0'

  const app = express()
  app.set('json spaces', 2)
  app.set('port', config.express.port)
  app.use('', defaultRouter)
  var proxy = require('express-http-proxy');
  app.use(proxy(process.env.HOMEINSPECTIONSERVER_URL))

  return app
}

请注意这里重要的代码:

process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0'

希望能帮助任何被困的人!

答案 1 :(得分:0)

我在使用 http-proxy-middleware 时遇到了同样的问题,问题是通过像这样添加 secure: false 来解决的

const {createProxyMiddleware} = require('http-proxy-middleware');
app.use('/firmware-images/:firmwareImageId/files/:fileId/download', createProxyMiddleware({ target: `${FILES_URL}`, changeOrigin: true, secure: false }));

我知道不是同一个包,但它是同样的问题,所以我希望它可以帮助某人。