Node.js + Nginx развертывает службу HTTPS

Node.js внешний интерфейс HTTPS Nginx
Node.js + Nginx развертывает службу HTTPS

Сегодня, после бесчисленных метаний, наконец-то свершилась долгожданная регистрация доменного имени. Так что мне не терпится развернуть и перенести мой личный веб-сайт блога на HTTPS.Я столкнулся с некоторыми ямами посередине, поэтому я сделаю запись здесь.

причина

Причины перехода сайта с http на https:

  • HTTPS более безопасен и может более эффективно предотвращать атаки «человек посередине», чем HTTP.Каждый проект надеется иметь безопасную базу. Хотя в блоге нет важных данных, это хорошее место для обучения войск.
  • Сейчас HTTP2 привлекает все больше и больше внимания, он может улучшить скорость доступа, а предпосылкой HTTP2 является HTTPS.

шаг

  1. Установить сертификат
  2. обратный прокси nginx
  3. Измените метод внешнего подключения

Установить сертификат

Зачем нужен сертификат? Это связано с дизайном протокола HTTPS. HTTPS, относящийся к безопасному протоколу передачи гипертекста, также может называться HTTP через SSL или HTTP через TLS. Проще говоря, HTTPS передает данные по протоколу Http, а SSL/TLS шифрует данные.

Как он реализует шифрование?

Во-первых, производители браузеров предварительно устанавливают каждый证书颁发机构сертификат для безопасной проверки доступа к сайту Затем лично证书颁发机构Запросите личный сертификат и примените сертификат к конфигурации сервера. Затем браузер обращается к серверу, получает открытый ключ, сопоставляет его с существующим списком сертификатов и решает, следует ли продолжать. Если он проходит, браузер связывается с сервером через открытый ключ и согласовывает два асимметричных закрытых ключа для их соответствующего шифрования передачи данных, тем самым устанавливая зашифрованный канал для предотвращения прослушивания посредником.

Как установить сертификат? Подать заявку на сертификат в центре сертификации. Текущие агентства включают Symantec, Comodo, GoDaddy и Let's Certbot. Здесь мы выбираем бесплатноLet's Certbot.

На официальном сайте есть подробная инструкция. моя средаLinux 16.04 Nginx, другие среды могут ссылаться на официальное описание веб-сайта:

#####Установить:

$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install python-certbot-nginx 
Начинать
$ sudo certbot --nginx certonly
авто-обновление

может относиться кздесь

Согласно подсказке, установка завершена успешно. Здесь есть посылка, то есть сервер должен иметь доменное имя, а отечественное доменное имя нужно оформлять в соответствии с требованиями Минпроминформа, именно поэтому мне нужно ждать более полмесяца.

обратный прокси

После установки сертификата, если статическая страница развернута в nginx, в этот момент служба HTTPS успешно развернута. Но в большем количестве сценариев приложений, с одной стороны, мы предоставляем статические сервисы, такие как img, js, css и т. д., с другой стороны, нам также нужны REST-сервисы. Но на данный момент, когда мы обращаемся к API службы Node.js через клиентские библиотеки HTTP, такие как axios или vue-resource, для получения данных, мы обнаруживаем, что браузер запрещает соединение. Причина в том, что после развертывания службы HTTPS весь сайт должен использовать HTTPS для передачи данных, включая получение ресурсов,GET/POSTзапрос и тд.

Как решить? Я сделал несколько обходных путей здесь. В то время я думал, что поскольку это API для доступа к серверу Node.js, я знаю, что Node.js поддерживает сервисы HTTPS, поэтому я воспринял как должное использование его в Node.OpensslПровести самоаттестацию. В интернете много подобных туториалов, но в браузере сертификат для самосертификации не распознается. Таким образом, этот метод осуществим, но не применяется к доступу других пользователей, и его невозможно применить к производственной среде. Порекомендуйте несколько инструментов здесь:

Во-первых, вы можете отправлять смоделированные браузеры для отправки различных запросов, что очень удобно для тестирования API. Здесь рекомендуется второй, потому что я начал использовать Chrome, но сообщение об ошибке было расплывчатым, в то время как Firefox более прямолинеен в отношении сообщений об ошибках запроса/ответа в сети, что очень помогло мне в этом вопросе.

Именно то, что дает Firefox:xxxx 提供了不支持的自签名证书.., я знаю, что самоподпись не будет работать, поэтому я подумал об этом на Nginx, думая, что у nginx есть функция обратного прокси, если вы скажете, сделайте api reverse proxy, и перейдите к порту службы узла, будет ли это полезно ? Итак, я нашел в Интернете учебник по обратному прокси Nginx.Операция выглядит следующим образом:

существует/ete/nginx/site-available/defaultсередина:

location /api {
    proxy_pass      http://localhost:8089;
    proxy_buffering on;
}

Перезапустите nginx и перезапустите службу узла.

успех!

Таким образом, мы позволяем службе REST не беспокоиться о проблеме с сертификатом через обратный прокси-сервер, потому что Nginx уже выполнил эту часть работы.

Измените метод внешнего подключения

Эта часть необязательна, потому что я использовалvue-resource, подключиться с помощьюthis.$httpСледовательно, HTTPS не может быть подключен.Чтобы решить эту проблему, вы можете:

  • использоватьaxios, простое и элегантное обращение

наконец

Весь процесс довольно запутанный, потому что я не знаком с базовым протоколом SSL/TLS, а Nginx тоже новый. Но надо сказать, что Nginx настроен по-дружески, и понять, что это значит, можно с первого взгляда. Так что конфигурация не сложная.

Далее я углублюсь в эту часть и напишу серию.