【问题标题】:NodeJS + Express using fetch(): How to bypass "Your connection is not private" in Javascript?NodeJS + Express 使用 fetch():如何绕过 Javascript 中的“您的连接不是私有的”?
【发布时间】:2017-02-20 16:42:05
【问题描述】:

目前我有一个 NodeJS + ExpressJS 客户端服务器设置,它对后端服务器进行 API 调用。但是每当我这样做时,我首先必须直接进入 API 后端服务器的 URL 并查看以下页面,然后转到 Advanced -> Proceed to https://backendserver.com:8080 (Unsafe),以便能够进行 API 调用没有任何错误。

有没有办法始终允许它Proceed to https://backendserver.com:8080 而无需通过浏览器手动执行?

这是我使用 fetch() 进行 API 调用的方法:

  loggingIn(userInfo) {

    var userInfoBody = {
        'username': `${userInfo.username}`,
        'password': `${userInfo.password}`
    }

    var configuration = {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(userInfoBody)
    }

    return function(dispatch) {
      fetch('https://backendserver.com:8080/creds', configuration)
      .then(response => response.json())
      .then(response => {
        console.log('Success and response is', response)
      })
      .catch((error) => {
        console.log("Error: ", error)
      })
    }

我的 NodeJS + Express 是这样设置的:

var express = require('express');
var cors = require('cors');
var path = require('path');
var config = require('../webpack.config.js');
var webpack = require('webpack');
var webpackDevMiddleware = require('webpack-dev-middleware');
var webpackHotMiddleware = require('webpack-hot-middleware');
var app = express();
var compiler = webpack(config);

app.use(cors());

app.use(webpackDevMiddleware(compiler, {noInfo: true, publicPath: config.output.publicPath}));

app.use(webpackHotMiddleware(compiler));

app.use(express.static('./dist'));

app.use('/', function (req, res) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  res.sendFile(path.resolve('client/index.html'))
})

var port = 3000;

app.listen(port, function(error) {
  if (error) throw error;
  console.log("Listening to ", port);
})

【问题讨论】:

  • 对 backendserver.com:8080 使用有效的证书
  • 将您的自签名证书添加到受信任的存储区(请参阅this answer)或使用letsencrypt 生成有效证书。
  • @JaromandaX 抱歉,这需要前端实现吗?因为我无法访问后端,并且我正在尝试弄清楚如何通过代码实现绕过它,所以应用程序的每个用户都不必手动绕过它。
  • @mallendeo 有没有办法通过代码实现来做到这一点?因为,多个用户将在不同的计算机上使用该应用程序,并且不希望每个用户都手动绕过它。想编写代码实现,这样它就会被不同计算机上的任何用户自动绕过它。
  • 您想绕过浏览器中的安全性 - 如果只是为了您自己,那么很简单,为您的浏览器接受的证书添加一个例外 - 如果是为了其他人,那么他们需要这样做一样(祝你好运)

标签: javascript node.js ssl express reactjs


【解决方案1】:

这里通常只有一个合适的解决方案:使用浏览器信任的服务器证书。

如果您有公共服务器,您需要从受信任的证书颁发机构获取证书。为此,Let's Encrypt 是一项很棒的(免费)服务,letsencrypt-express 将其与 Express 很好地集成在一起。

如果您有私有服务器(例如开发或测试服务器,或仅由少数浏览器使用的服务器),您可以只使用自签名证书并将其添加为受信任的浏览器或操作系统中的证书。

【讨论】:

  • 抱歉,在我接受答案并投票之前,我有几个问题。我是整个安全领域的新手,所以如果我没有正确使用我的条款,请原谅。当您提到私有服务器时,您是在谈论我向其发出 API 请求的后端 API 服务器吗?此外,这个应用程序将被多个用户使用,那么每个用户都必须手动将受信任的证书添加到自己的浏览器吗?如果是这样,有没有办法实现代码,它会做同样的事情并绕过Your connection is not private,这样每个用户都不必这样做?
  • @LyManeug “私人”是指“仅由少数客户使用”。但是,如果您的应用程序将被很多人使用,您将必须从证书颁发机构获取证书,并使用该证书而不是我假设的自签名证书来设置您的服务器现在使用。
  • @LyManeug 本质上,要使连接私有化,您需要让浏览器信任您的服务器证书。如果您从证书颁发机构获得证书,则浏览器知道他们信任该证书颁发机构,并且该证书颁发机构信任您,因此浏览器将信任您的服务器。
  • 这都是供多个用户内部使用和用于测试目的。那么我怎样才能让浏览器信任我的服务器证书,我可以用代码而不是手动来做呢? “我的服务器”是指客户端服务器,对吗?
  • @LyManeug 您不能自动执行此操作,因为这会破坏此处信任的全部目的。 (如果您可以使用不受信任的服务器并自动使其受信任,那么这不是一个安全的系统)。但是您通常会在浏览器设置中找到 SSL 证书列表,您可以在其中添加它(ChromeFirefox 的说明)。 “服务器”是指您要连接的服务器(您的 API 服务器)。
猜你喜欢
  • 1970-01-01
  • 2022-06-10
  • 2017-10-19
  • 2018-07-03
  • 2017-10-15
  • 1970-01-01
  • 1970-01-01
  • 2015-04-01
  • 2021-01-31
相关资源
最近更新 更多