решено !!
Многие проблемы были затронуты одновременно (несмотря на отсутствие у меня опыта работы с redbird и letsencrypt.
- Страница magi c 404 / Not found: Я полагаю, что это был сервер lighttpd , который, кажется, был предварительно установлен в моем VPS.
Порт 80 был перенаправлен через iptables, но я предполагаю, что в той или иной настройке конфигурации я мог перенаправить входящие запросы на * 807 * localhost порт 80 (который не перенаправлен).
Мое недоразумение с redbird: Глядя на примеры в файле README, я подумал, что redbird вроде "
multi- reverse_proxy" в том смысле, что вы могли перенаправлять запросы http и https с помощью одного экземпляр redbird.
Но я наконец-то понял, что (возможно, не очень хорошо названный) параметр port , который, по сути, является портом http, служит только для настройки встроенного в безусловном http-> https редиректоре (о котором я уже читал, но я думал, что это необязательно).
Фактическая основная проблема: Если в вашем DNS активирован DNSSE C, вам необходимо определить в нем регистр
CAA , указывающий на
letsencrypt.org .
В данный момент я вместо этого отключил DNSSE C, поскольку панель управления моего провайдера не позволяет мне создавать такой регистр.
Я обнаружил его, пытаясь получить сертификаты через certbot (sudo apt-get install certbot
, что я должен сказать, что, если бы я знал об этом раньше, я бы не стал заботиться о попытке интеграции letsencrypt в Redbird.
Это гораздо более многословно (хотя redbird больше похож на черный ящик при возникновении ошибок) и указал, что мне нужен регистр CAA.
Вот заметки, которые я сделал по этому поводу (на случай, если кому-то будет интересно):
Free SSL Certificates with Certbot
Install certbot:
sudo apt-get install certbot
Create:
sudo certbot certonly --manual --preferred-challenges http -d <domain>
Renew:
sudo certbot renew
Caveats:
DNSSEC
If your DNS server has DNSSEC enabled, you will need to add a CAA
register pointing to letsencrypt.org.
...and your DNS provider my not allow to create it (at least I
couldn't with CDMON. Also not -yet- complained).
production = false
- для других видов тестирования: Я прочитал, что если вы введете
true во время тестирования, вам может быть запрещен letsencrypt, если вы выполняете слишком много запросов.
Установив значение false, вы можете проверить перенаправления, но вы все равно увидите ошибки, связанные с letsencrypt, даже если вы можете перемещаться без безопасного сертификата (я думаю, что самоподписанный разрешить тестирование). Так что не ожидайте действительного.
Порт ssl используется для перенаправления: Не является (большой) проблемой, но если вы укажете порт ssl, отличный от 443, встроенный перенаправитель безусловно перенаправит вас на этот порт.
Запуск redbird с root и использование стандартных (80 и 443) портов работает нормально. Но если вы, как и я, хотите использовать альтернативные порты для запуска redbird с непривилегированным пользователем, вы будете перенаправлены на этот альтернативный порт вместо 443 (даже если он будет перенаправлен через iptables).
Вот мой (почти *) последний скрипт для redbird:
const Redbird = require("redbird");
const proxy = Redbird({
port: 1080,
xfwd: false, // Disable the X-Forwarded-For header
ssl: {
port: 1443,
},
letsencrypt: {
path: __dirname + '/certs',
port: 9999,
// LetsEncrypt minimal web server port for handling challenges.
// Routed 80->9999, no need to open 9999 in firewall. Default 3000
// if not defined.
},
});
proxy.register('exposito.bitifet.net', 'http://exposito.bitifet.net:8001', {
ssl: {
http2: true,
letsencrypt: {
email: 'xxxxxx@gmail.com', // Domain owner/admin email
production: true,
// WARNING: Only use this flag when the proxy is verified to
// work correctly to avoid being banned!
},
}
});
(*) Мне все еще нужно исправить проблему перенаправления с явным портом (5), потому что я не хочу запускать redbird как root. Но я знаю, что можно разрешить пользователям прослушивать данные порты. Даже я, вероятно, лучше попытаться пропатчить redbird, чтобы разрешить указывать порты прослушивания и перенаправления раздельно.
EDIT: Это уже реализовано (и задокументировано) с использованием (необязательного) параметра redirectPort в разделе ssl . Только что добавил redirectPort: 443
и работа выполнена !!
РЕДАКТИРОВАТЬ 2: Ради завершения все еще была другая проблема, с которой я боролся.
Чтобы все заработало Наконец, я настроил перенаправление на порт http вместо одного https.
То есть: поступающие запросы https перенаправляются на порт http моего приложения.
Кажется странным, но это работает. По крайней мере, если вам не нужны какие-либо исключительно функции https, такие как уведомления pu sh (которые я планирую использовать в будущем).
Но это предполагает открытие http-сервера как минимум на локальном хосте. Что сейчас не является серьезной проблемой (это всего лишь сервер игровых площадок), но я планирую использовать Redbird на работе для прокси-сервера нескольких доменов на разных серверах, так что это заставило бы нас открыть http, по крайней мере, в нашем DMZ vlan (который является дополнительный риск, которого лучше избегать ...).
Когда я попытался перенаправить на https, я получил ошибку DEPTH_ZERO_SELF_SIGNED_CERT.
Хорошо: это говорит мне, что redbird (или узел) не доверяйте моему оригинальному (самоподписанному) сертификату. Я знаю, что есть возможность указать узлу принять эти сертификаты. Но, возможно, это не путь к go ...
Поэтому я настроил свое приложение на использование того же сертификата, который Redbird получает через letsencrypt.
Но потом я получил эту другую ошибку :
UNABLE_TO_VERIFY_LEAF_SIGNATURE
Изучив немного, я нашел этот ответ StackOverflow , который объясняет, как получить все root и промежуточные сертификаты, доверенные Mozilla , и заставить узел доверять их.
В итоге я сделал следующее:
Установлено node_extra_ca_certs_mozilla_bundle Пакет:
npm install --save node_extra_ca_certs_mozilla_bundle
С добавлением NODE_EXTRA_CA_CERTS=node_modules/node_extra_ca_certs_mozilla_bundle/ca_bundle/ca_intermediate_root_bundle.pem
к команде start в пакете . json s scripts section.
Обновлен мой скрипт redbird, чтобы он снова указывал на порт https (протокол и):
proxy.register('exposito.bitifet.net', 'https://localhost:4301', {...]);
Вот моя последняя конфигурация redbird:
const Redbird = require("redbird");
const proxy = Redbird({
port: 1080,
xfwd: false, // Disable the X-Forwarded-For header
ssl: {
port: 1443,
redirectPort: 443
// key: "/etc/bitifet/exposito/ssl/private.key",
// cert: "/etc/bitifet/exposito/ssl/public.cert",
},
letsencrypt: {
path: __dirname + '/certs',
port: 9999,
// LetsEncrypt minimal web server port for handling challenges.
// Routed 80->9999, no need to open 9999 in firewall. Default 3000
// if not defined.
},
});
proxy.register('exposito.bitifet.net', 'https://localhost:4301', {
ssl: {
http2: true,
letsencrypt: {
email: 'xxxxxx@gmail.com', // Domain owner/admin email
production: true,
// WARNING: Only use this flag when the proxy is verified to
// work correctly to avoid being banned!
},
}
});
А вот и мой пакет. json содержимое файла:
{
"name": "redbird_domains",
"version": "0.0.1",
"description": "Local Domains Handling",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "NODE_EXTRA_CA_CERTS=node_modules/node_extra_ca_certs_mozilla_bundle/ca_bundle/ca_intermediate_root_bundle.pem node ./index.js"
},
"author": "Joanmi",
"license": "GPL-3.0",
"dependencies": {
"node_extra_ca_certs_mozilla_bundle": "^1.0.4",
"redbird": "^0.10.0"
}
}