如何为以下设置安装 SSL(React 前端 + Nodejs 后端 + 自定义域 Heroku)
Posted
技术标签:
【中文标题】如何为以下设置安装 SSL(React 前端 + Nodejs 后端 + 自定义域 Heroku)【英文标题】:How to install SSL for the following setup (React Frontend + Nodejs Backend + Custom Domain Heroku) 【发布时间】:2019-05-29 06:08:49 【问题描述】:关于我的设置的一般信息
目前我正在使用react 和nodejs API 构建一个Web 应用程序,为该Web 应用程序提供数据。这两个应用程序都托管在heroku.com 上,并且彼此独立运行。我从不同的托管服务提供商处购买了一个自定义域,并使用 heroku custom domain 选项将 DNS 指向我的网站。
关于我的设置的技术细节
NodeJS 服务器:Express NodeJS 版本:v10.15.0 React 版本:v16.2.0 自定义域:www.tabbs.nl Heroku 域:tabbs-web-app.herokuapp.com
我遇到的问题
为了为 react/NodeJS 设置 SSL,我一直在研究大量文档和教程,但找不到关于如何为我的设置设置 SSL/安全性的不错教程。
我已经阅读过的教程:
Node + Express + Lets Encrypt How to use SSL/TLS with nodejs 堆栈溢出帖子,可能还有很多我现在忘记了。我想实现什么?
我想要实现的目标是在 React Web 应用程序(前端)和 NodeJS API(后端)之间建立安全连接,以便它们之间的所有数据都是加密且安全的。此外,我希望我的自定义域(由与 Heroku 不同的托管服务提供商购买)是安全的并强制使用 https。
如有任何问题或其他信息,请随时提问!
【问题讨论】:
【参考方案1】:你试过在 node 中使用 https 模块吗?
你可以这样做:
var express = require('express');
var https = require('https');
var http = require('http');
var app = express();
http.createServer(app).listen(80);
https.createServer(options, app).listen(443);
express() 返回的应用程序实际上是一个 javascript 函数,旨在作为回调传递给 Node 的 HTTP 服务器以处理请求。这使得为您的应用程序的 HTTP 和 HTTPS 版本提供相同的代码库变得很容易,因为应用程序不会从这些版本继承(它只是一个回调。
如果您使用的是 create react app,请打开终端并输入“npm run build”。这将创建一个包含所有静态文件的构建文件夹。
现在回到您的节点后端服务并添加以下内容:
var express = require('express');
var path = require('path');
var https = require('https');
var http = require('http');
var app = express();
const options =
key: fs.readFileSync("/srv/www/keys/my-site-key.pem"),
cert: fs.readFileSync("/srv/www/keys/chain.pem")
;
http.createServer(app).listen(80);
https.createServer(options, app).listen(443);
app.use(express.static(path.join(__dirname, 'build')));
app.get('/', function(req, res)
res.sendFile(path.join(__dirname, 'build', 'index.html'));
);
如果你使用 react 路由器来处理你的 web 应用程序的路由,那么你可以修改 GET 请求:
var express = require('express');
const path = require('path');
var https = require('https');
var http = require('http');
var app = express();
const options =
key: fs.readFileSync("/srv/www/keys/my-site-key.pem"),
cert: fs.readFileSync("/srv/www/keys/chain.pem")
;
http.createServer(app).listen(80);
https.createServer(options, app).listen(443);
app.use(express.static(path.join(__dirname, 'build')));
app.get('/*', function(req, res)
res.sendFile(path.join(__dirname, 'build', 'index.html'));
);
【讨论】:
有道理!但是为了提供 https,SSL 证书部分呢? :) 您可以为 https 模块提供一个可选对象作为第一个参数。看这里:sitepoint.com/how-to-use-ssltls-with-node-js mate...请快速查看问题,我已经阅读了该文章,但问题不在于创建 ssl 或提供,但我需要 1 个证书并将它们分别用于服务器?还是我需要创建不同的 SSL 证书?你知道吗? 您找到解决方案了吗?我对 heruko 和自定义域有同样的问题。【参考方案2】:这不是一个复杂的问题,不用担心 ssl,只需为 Node.JS/Express 创建自己的证书就足够了。
而且,React 有一个内置的方式来进行 api 调用,
将此行添加到您的 React 安装的 package.json 中,
"proxy": "http://localhost:8000/"
然后像这样调用 api 服务,
//Generic API Call
callApi = async () =>
const response = await fetch('/api/hello');
const body = await response.json();
if (response.status !== 200) throw Error(body.message);
return body;
;
// A Submit handler to proxy
handleSubmit = async e =>
e.preventDefault();
const response = await fetch('/api/myrequest',
method: 'POST',
headers:
'Content-Type': 'application/json',
,
body: JSON.stringify( post: this.state.post ),
);
const body = await response.text();
this.setState( responseToPost: body );
;
一切正常。
【讨论】:
以上是关于如何为以下设置安装 SSL(React 前端 + Nodejs 后端 + 自定义域 Heroku)的主要内容,如果未能解决你的问题,请参考以下文章
如何为 api 部署 node js express js,为前端部署 react js,为管理员部署 angular
如何为 AWS Elb 后面的 reactJs SPA 重定向 http 到 https?
如何为自己的WordPress站点安装SSL证书开启https访问
如何为自己的WordPress站点安装SSL证书开启https访问