У меня есть веб-приложение (React) и серверная служба (Nodejs), работающие (оба) в одном экземпляре Linux на Lightsail. Мне удалось настроить свой домен (deepassure.com) с HTTPS, используя сертификат SSL publi c, предоставленный Lightsail. Веб-приложение работает с Ngix, пока все хорошо. Проблема возникает, когда веб-приложение отправляет запрос в бэкэнд-сервис. Учитывая, что сервер работает по протоколу HTTPS, каждый HTTP-вызов, выполняемый для серверной части, блокируется сервером, и появляется сообщение об ошибке «Страница в 'https://deepassure.com/admin/accountmapping» была загружена через HTTPS, но запросил небезопасный XMLHttpRequest конечная точка 'http://35.188.221.50: 3001 / api / files '. Этот запрос был заблокирован; контент должен обслуживаться по HTTPS. ". Я изменил вызов в своем веб-приложении (используя Ax ios), поэтому теперь, когда я вызываю службу, это делается с использованием HTTPS:
import http from "../../../../services/httpService";
export function processFile() {
return http.post("https://35.188.211.50:3001/api/files");
}
промежуточная программа httpService выглядит следующим образом:
import axios from "axios";
axios.interceptors.response.use(null, error => {
const exceptedError =
error.response &&
error.response.status >= 400 &&
error.response.status < 500;
if (!exceptedError) console.log("error --> ", error);
return Promise.reject(error);
});
function setJwt(jwt) {
//set the token on the header to make the session valid
axios.defaults.headers.common["x-auth-token"] = jwt;
}
export default {
get: axios.get,
post: axios.post,
put: axios.put,
delete: axios.delete,
setJwt
};
Но при таком подходе я получаю ошибку «ERR_SSL_PROTOCOL_ERROR». Я изменил свою реализацию в бэкэнде, поэтому я прикрепил самозаверяющие сертификаты, как описано здесь https://medium.com/nodejs-tips/ssl-certificate-explained-fc86f8aa43d4:
const express = require("express");
const fs = require("fs");
const https = require("https");
const privateKey = fs.readFileSync("client-key.pem");
const certificate = fs.readFileSync("client-certificate.pem");
const app = express();
const files = require("./account_mapping/routes/files");
const credentials = { key: privateKey, cert: certificate };
require("./startup/cors")(app);
app.use("/api/files", files);
require("./startup/prod")(app);
const port = process.env.PORT || 3001;
const httpsServer = https.createServer(credentials, app);
const server = httpsServer.listen(port, () =>
console.log(`Listening in port ${port}...`)
);
module.exports = server;
Но теперь я получаю ошибку «ERR_CERT_AUTHORITY_INVALID». Я знаю, что можно установить некоторые флаги, чтобы избежать этой ошибки, как объясняется в ссылке, которой я поделился, но это не имеет смысла, поскольку я пытаюсь настроить производственную среду. Файл конфигурации в Nginx выглядит следующим образом:
server {
listen 80;
listen [::]:80;
root /var/www/deepassure.com/html;
index index.html index.htm index.nginx-debian.html;
server_name deepassure.com www.deepassure.com;
location / {
try_file $uri $uri/ = 404;
}
}
Вот некоторые из моих вопросов:
Если Lightsail предоставляет публикуемый c SSL-сертификат, нужно ли мне генерировать новый, использующий Letsencrypt для моего веб-приложения? Если это так, должен ли я использовать тот же сертификат для моей бэкэнда, используя мою текущую реализацию ?.
Если мне не нужно создавать дополнительный сертификат, как я должен использовать этот SSL-сертификат publi c, предоставленный Lighsail, в моей бэкэнд-службе? Или как я могу заставить мою серверную службу работать с этим сертификатом publi c ?. Может быть, мне нужно запустить свой бэкэнд в отдельном экземпляре с HTTP?