Ошибка Lets-encrypt: Сбой HTTP-01 перед полетом / Dry Запуск - PullRequest
3 голосов
/ 10 января 2020

Я настроил прокси на основе Redbird, следуя его примерам файла README .

К настоящему времени я настроил один домен для http и https, и он работает хорошо (https все еще используя самозаверяющий сертификат).

Но сейчас я пытаюсь настроить его на использование letsencrypt для автоматического получения действительных сертификатов ssl, и я застреваю в следующей ошибке:

 {"level":30,"time":1578681102208,"pid":21320,"hostname":"nigul","name":"redbird","0":false,"1":"setChallenge called for 'exposito.bitifet.net'","msg":"Lets encrypt debugger","v":1}
[acme-v2] handled(?) rejection as errback:
Error: Error: Failed HTTP-01 Pre-Flight / Dry Run.
curl 'http://exposito.bitifet.net/.well-known/acme-challenge/test-cf55199519d859042f695e620cca8dbb-0'
Expected: 'test-cf55199519d859042f695e620cca8dbb-0.MgLl7GIS59DPtPMejuUcXfddzNt8YxfLVo5op670u8M'
Got: '<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
  <title>404 - Not Found</title>
 </head>
 <body>
  <h1>404 - Not Found</h1>
 </body>
</html>
'
See https://git.coolaj86.com/coolaj86/acme-v2.js/issues/4
    at /home/joanmi/SERVICES/redbird_domains/node_modules/acme-v2/index.js:49:10
    at process._tickCallback (internal/process/next_tick.js:68:7)

Насколько я понимаю, это говорит мне о том, что Lets Encrypt пытается получить доступ к URL http://exposito.bitifet.net/.well-known/acme-challenge/test-cf55199519d859042f695e620cca8dbb-0 с помощью следующей команды:

curl 'http://exposito.bitifet.net/.well-known/acme-challenge/test-cf55199519d859042f695e620cca8dbb-0'

... и что это получение, которое кажется страницей 404 HTML Error, которую я не имею ни малейшего понятия, куда бы она ни пришла.

И, фактически, выполнение этой команды curl или просто вставка этого URL в моем браузере (вы можете попробовать: я оставил сервер запущенным), я получаю заданную строку Ожидаемая , поэтому, с моей точки зрения, кажется, что моя конфигурация была правильной, но по какой-то причине , Давайте сервера Шифрования были достигнуты На другом сервере (либо из-за неправильной маршрутизации, либо из-за DNS).

Но, с другой стороны, я предполагаю, что более вероятно, что я сделал что-то не так в своей конфигурации.

Здесь я вставляю Весь мой сценарий (порты 80 и 443 перенаправляются на 1080 и 1443 соответственно через iptables, потому что сценарий запускается непривилегированным пользователем):

const Redbird = require("redbird");

const proxy = Redbird({
    port: 1080,
    xfwd: false, // Disable the X-Forwarded-For header
    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.
    },
    ssl: {
        http2: true,
        port: 1443, // SSL port used to serve registered https routes with LetsEncrypt certificate.
    }

});


proxy.register('exposito.bitifet.net:9999', 'http://localhost:8001', {
  ssl: {
    letsencrypt: {
      email: 'xxxxxx@gmail.com', // Domain owner/admin email
      production: false,
                // WARNING: Only use this flag when the proxy is verified to
                // work correctly to avoid being banned!
    }
  }
});

proxy.register("exposito.bitifet.net", "http://localhost:8001");

Любая подсказка будет приветствоваться.

Спасибо.

1 Ответ

0 голосов
/ 14 января 2020

решено !!

Многие проблемы были затронуты одновременно (несмотря на отсутствие у меня опыта работы с redbird и letsencrypt.

  1. Страница 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 , и заставить узел доверять их.

В итоге я сделал следующее:

  1. Установлено node_extra_ca_certs_mozilla_bundle Пакет:

    npm install --save node_extra_ca_certs_mozilla_bundle
    
  2. С добавлением NODE_EXTRA_CA_CERTS=node_modules/node_extra_ca_certs_mozilla_bundle/ca_bundle/ca_intermediate_root_bundle.pem к команде start в пакете . json s scripts section.

  3. Обновлен мой скрипт 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"
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...