nginx reverse_proxy с несколькими серверами / блокировкой местоположений и предварительной визуализацией

У меня есть особые потребности в прокси-сервере Nginx

  • У меня есть новое приложение JS (+ nginx) под основным URL new.example.com и старое приложение, работающее на другом URL old.example.com
  • Мне нужно обработать предварительную визуализацию для поисковых систем для моего нового приложения (я использую официальный сценарий prerender nginx в качестве основы). Старому приложению не нужен предварительный рендеринг (и фактически оно действует как мой предварительный рендеринг на данный момент)
  • Когда пользователь вводит www.example.com, он обращается к моему прокси-серверу nginx, которому требуется
    • Для прокси / admin на old.example.com/admin
    • Для проксирования всех запросов ботов на предварительный рендерер
    • Для прокси по умолчанию на new.example. com

Чтобы упростить задачу, у меня есть блоки @location, представляющие каждое приложение (но, возможно, это несовместимо с остальными, пожалуйста, сообщите мне)

location @newapp { proxy_pass http://new.example.com:8080; } location @oldapp { proxy_pass http://old.example.com:8080; }

Сейчас, когда мое новое приложение находится в стадии разработки, я хотел бы, чтобы URL-адреса / admin перенаправляли на мое старое приложение. Я нашел где-то в Интернете трюк с использованием try_files с файлом maintenance.html

location / admin { try_files /main maintenance.html @oldapp; }

Теперь все становится еще серьезнее, поскольку - Мое новое приложение требует предварительной отрисовки - Мое старое приложение не требует предварительной отрисовки и используется в качестве запасного варианта, когда требуются мета. Этот сервер RADIUS расположен на Raspberry Pi с Raspbian Stretch и использует FreeRADIUS 3.0 и Hostapd. Некоторые из ...

Я тестирую функции WLAN устройства, подключенного к серверу RADIUS. Этот сервер RADIUS расположен на Raspberry Pi с Raspbian Stretch и использует FreeRADIUS 3.0 и Hostapd.

Некоторые из тестовых примеров EAP-TLS проверяют, что произойдет, если используются длинные «цепочки доверия» . Под длинными цепочками доверия я имею в виду открытые ключи, которые были подписаны длинной цепочкой промежуточных сертификатов .

Теперь я столкнулся с проблемой, что в некоторых тестовых случаях FreeRADIUS возвращает конкретную ошибку в своем журнале:

SSL сообщает об ошибке 25: превышено ограничение длины пути

Один из этих тестовых случаев описан ниже:

Файлы сертификата RADIUS: cn = MyCA, O = MyOrg).

Оба эти сертификата находятся в файле, на который указывает SSLCACertificateFile директива Apache, поскольку нам необходимо аутентифицировать сертификаты клиентов, подписанные обоими центрами сертификации. Этого не происходит: доступ могут получить только браузеры с сертификатами клиентов, подписанными CA1 или CA2, в зависимости от порядка сертификатов CA в файле. Таким образом, если только клиенты из CA1 могут аутентифицироваться, после переключения порядка в SSLCACertificateFile и перезагрузки Apache только клиенты из CA2 смогут аутентифицироваться.

Если мы выполним квитирование SSL с помощью openssl s_client -connect < server>: -prexit , мы замечаем, что только одно из отличительных имен CA отправляется в списке принятых CA, а отправляемый dn зависит от порядка, в котором сертификаты CA находятся в SSLCACertificateFile. Это имеет смысл, поскольку вычисляемый хеш Openssl для двух отличительных имен одинаков, поскольку отличительные имена не должны быть чувствительны к регистру.

Но похоже, что браузер выполняет сопоставление с учетом регистра, вместо этого, как в Apache регистрирует сертификат, установленный в браузере, не отправляется, если «объявленный CA» - это CA1, а сертификат клиента подписан CA2, и наоборот. Мы пробовали использовать Firefox в Windows и Linux, а также Internet Explorer и Chrome в Windows.

В противном случае, браузер командной строки curl не имеет этой проблемы, когда мы вызываем https URL с сертификатом клиента и ключом в формате PEM.

1
задан 19 September 2017 в 12:36
1 ответ

Если не копаться, я бы сказал, что вы не можете убедить браузеры выполнять здесь поиск без учета регистра. В случае простой веб-службы вы можете создать еще один VirtualHost, на котором распределены все клиенты (скажем, https://detect-cert.example.com ).

Это будет означать, что клиент согласовывает TLS один раз , затем выполняется перенаправление, а затем еще одно согласование TLS.

VirtualHost detect-cert.example.com:

  • убедитесь, что вы принимаете optional_no_ca сертификаты от браузеров
  • no SSLCACertificateFile
  • посмотрите либо SSL_CLIENT_I_DN , либо SSL_CLIENT_CERT_CHAIN_ переменную среды
  • перенаправить (HTTP 302) браузер на ca1clients.example.com или ca2clients.example.com

VirtualHost ca1clients.example.com: убедитесь, что вам требуются сертификаты от браузеров

  • SSLCACertificateFile CA_lowercase.pem
  • VirtualHost ca2clients.example.com:

    • убедитесь, что вам требуется
    • SSLCACertificateFile CA_uppercase.pem

    Но ваше веб-приложение должно поддерживать два доменных имени одновременно (например, через заголовок X-Forwarded-Host ). Он никогда не должен указывать браузеру, который вошел через ca2clients.example.com , повторно войти через ca1clients.example.com . Еще одна трудность заключается в том, что пользователи обмениваются ссылками между собой (например, отправляют по электронной почте ссылки на некоторый контент).

    0
    ответ дан 4 December 2019 в 04:37

    Теги

    Похожие вопросы