У меня настроен сервер Node.js, и я пытаюсь использовать HTTPS с моим сертификатом Let's Encrypt на Apache. Вот соответствующий код, который я установил:
var fs = require('fs'),
https = require('https'),
express = require('express'),
options = {
key: fs.readFileSync('/etc/letsencrypt/live/www.mysite.com/privkey.pem'),
cert: fs.readFileSync('/etc/letsencrypt/live/www.mysite.com/fullchain.pem'),
ca: fs.readFileSync('/etc/letsencrypt/live/www.mysite.com/chain.pem')
}, ...
Когда я пытаюсь запустить скрипт, я получаю такую ошибку:
Error: EACCES: permission denied, open '/etc/letsencrypt/live/www.mysite.com/privkey.pem'
Это потому, что только корневой владелец владеет каталогами и файлами Let's Encrypt для SSL, который в настоящее время используется с моими более чем 30 регулярными веб-сайтами на Apache. Я пытаюсь настроить приложение Node для одного веб-сайта. Мои файлы проекта node app.js принадлежат mysite1: mysite1, и я знаю, что безопаснее запускать приложение узла от имени пользователя без полномочий root (например, mysite1).
Как правильно обеспечить безопасную работу моего Let's Encrypt HTTPS с приложением Node.js (на Apache) без необходимости предоставлять моему каталогу / etc / letsencrypt 755 разрешения?
РЕДАКТИРОВАТЬ - УТОЧНЕНИЕ:
Node.js и Apache работают бок о бок. В моем файле virtualHost .conf для веб-сайта 443 DocumentRoot - это /home/mysite1/mysite1.com, для чего был установлен SSL Let's Encrypt.
Мое приложение Node.js установлено в / home / mysite1 / app. На веб-сайте я использую socket.io в качестве чат-комнаты на уровне всего сайта, и он отлично подключается / работает со следующими условиями (если приложение запускается от имени пользователя root), ProxyPass не требуется:
<script src="//www.mysite1.com:3000/socket.io/socket.io.js"></script>
<script>var socket = io('https://www.mysite1.com:3000');</script>
Когда я запускаю приложение как пользователь без полномочий root (в целях безопасности), единственная ошибка, которую я вижу, - это то, что в моем приложении узла есть ошибка разрешения при попытке доступа / настройки файлов SSL. Что конкретно делать, мне не очень понятно, как запустить этот "за" Apache, или есть более простое решение?
Похоже, должно быть более простое решение, может быть, node.js запускается от имени пользователя root, чтобы получить данные SSL и запустить сервер, прежде чем передать его пользователю, как это делает Apache?
РЕДАКТИРОВАТЬ 2:
Основываясь на предложении Майкла и Эзры, я некоторое время искал в Google и изменил кое-что, но не могу заставить его работать. В Apache я сделал что-то вроде этого:
<VirtualHost *:443>
ServerAlias mysite1.com
DocumentRoot /home/mysite1/mysite1.com
DirectoryIndex index.html index.php
<Directory /home/mysite1/mysite1.com>
.. web config stuff
</Directory>
ProxyRequests Off
ProxyPreserveHost On
ProxyVia Full
<Proxy *>
Require all granted
</Proxy>
<Location /node>
ProxyPass http://127.0.0.1:3000
ProxyPassReverse http://127.0.0.1:3000
</Location>
SSLEngine on
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/www.letshangout.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.letshangout.com/privkey.pem
</VirtualHost>
В моем файле проекта node app.js я удалил параметры require ('https') и сертификата, заменил их пакетом «http» и попытался инициализировать скрипт.
На странице моего веб-сайта у меня есть сценарии, которые пытаются загрузить socket.io и подключиться к приложению узла:
<script src="https://www.mysite1.com/node/socket.io/socket.io.js"></script>
<script>var socket = io('https://www.mysite1.com/node/');</script>
Когда я загружаю страницу, возникает ошибка 500, и скрипт не загружается. Что мне следует изменить в моей конфигурации Apache или URL-адресах скриптов? Я никогда раньше не использовал прокси с узлом, это мое первое приложение узла.
РЕШЕНИЕ:
Я понял это, это была комбинация других вещей, которые нужно было сделать с использованием веб-сокетов и javascript:
1) Конфигурация Apache для работы с веб-узлами https://stackoverflow.com/a/41685748/2317571
2) Конфигурация подключения к сокету JavaScript для клиента https://stackoverflow.com/questions/22919276/how-to-connect-socket-io-through-a-reverse-proxy
3) (бонусный совет): благодаря совету Майкла и ezra-s по установке приложения узла за Apache, я могу использовать брандмауэр ufw и заблокировать порт 3000 node / socket.io на localhost - на один порт меньше (и безопасность дыра) открыта миру. Надеюсь, эта информация поможет кому-то другому.
1. Запустите приложение Node.js в отдельном порту.
2. Обратные прокси к нему.
Примечание: Соединение между приложением Node.js и Apache будет использовать HTTP. Однако это будет происходить только на уровне «localhost». Поэтому все будет хорошо.
Конфигурация VirtualHost:
<VirtualHost *:443>
ServerName nodeapp.com
ServerAdmin webmas@localhost
DocumentRoot /var/www/nodeapp
SSLEngine on
SSLCertificateFile /path/to/cert
SSLCertificateKeyFile /path/to/key
ProxyRequests off
ProxyPass "/" "http://127.0.0.1:node_app_port/"
ProxyPassReverse "/" "http://127.0.0.1:node_app_port/"
ErrorLog ${APACHE_LOG_DIR}/nodeapp_error.log
CustomLog ${APACHE_LOG_DIR}/nodeapp_access.log combined
</VirtualHost>