HTTPS и SSL сертификаты на Lighsail - PullRequest
0 голосов
/ 16 марта 2020

У меня есть веб-приложение (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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...