Назад | Перейти на главную страницу

421 неверно направленный запрос

Иногда я получаю следующую ошибку 421:

Неверный запрос

Клиенту требуется новое соединение для этого запроса, так как запрошенное имя хоста не совпадает с указанием имени сервера (SNI), используемым для этого соединения.

Однако обновление браузера устраняет ошибку, и страница загружается нормально. В следующий раз загрузка страницы не приведет к ошибке, и поэтому шаблон кажется довольно случайным. Единственная закономерность, которую я вижу, это то, что это может произойти, когда я перенаправляю страницу с помощью заголовка ("Location:". $ Url);

У меня есть многодоменный сертификат PositiveSSL от Comodo. Мои серверы - это Apache на общем веб-хостинге, поэтому у меня нет доступа к конфигурации.

Я загружаю страницы из одного домена, и внутри страницы есть ссылки на второй домен в сертификате.

Все, что я читал об этой ошибке, похоже, указывает на то, что эта проблема связана с тем, что это многодоменный сертификат.

Я хотел бы знать, есть ли что-нибудь на стороне кодирования веб-страницы (php), что может вызвать это (и может быть исправлено), или это ошибка конфигурации или, возможно, ошибка сервера, и только моя служба хостинга может почини это.

Моя служба хостинга до сих пор не могла ничего предоставить и просила перезвонить с указанием точного времени, когда это произойдет в следующий раз, чтобы они могли это выяснить. Любая помощь будет оценена, поскольку я не слишком уверен, что они смогут это понять.

ОБНОВИТЬ Ок, почти пару лет спустя решил, что пора с этим разобраться. Мне удалось решить большинство проблем, удалив свои статические домены, которые обслуживали изображения и javascript. Однако я все еще использовал второй домен для некоторой части этого контента, и, в частности, Safari по-прежнему вызывал у меня проблемы.

Я провел дополнительное исследование и наткнулся на другую статью, говорит об этом здесь. В точности то, что описывает @Kevin. В статье подтверждено, что это происходит в Safari. Поэтому, следуя совету, я приступил к получению отдельных сертификатов для каждого домена. Я нахожусь на общем хосте (Webhostinghub) и обнаружил, что теперь они предлагают бесплатный SSL (AutoSSL), который обновляется автоматически. Это звучало неплохо, чтобы быть правдой. Они установили мне 5 бесплатных сертификатов. Все идет нормально. Я могу даже попытаться повторно включить статические домены для тестирования. Если все это сработает, я сэкономлю $ для загрузки в качестве бонуса и позволю истечению срока действия моих сертификатов Comodo в июле.

Это вызвано следующей последовательностью событий:

  1. Сервер и клиент поддерживают и используют HTTP / 2.
  2. Клиент запрашивает страницу по адресу foo.example.com.
  3. Во время согласования TLS сервер представляет сертификат, действительный для обоих foo.example.com и bar.example.com (и клиент принимает это). Это может быть сделано с помощью подстановочного сертификата или сертификата SAN.
  4. Клиент повторно использует соединение, чтобы сделать запрос на bar.example.com.
  5. Сервер не может или не хочет поддерживать повторное использование междоменного соединения (например, потому что вы настроили их SSL иначе и Apache хочет принудительно пересмотреть TLS) и обслуживает HTTP 421.
  6. Клиент не пытается автоматически установить новое соединение (см., Например, Ошибка Chrome # 546991, теперь исправлено). В соответствующий RFC говорит, что клиент МОЖЕТ повторить попытку, а не ДОЛЖЕН или ДОЛЖЕН. Отказ от повторной попытки не очень удобен для пользователя, но может быть желателен для инструмента отладки или библиотеки HTTP.

Событие №6 находится вне вашего контроля, но в зависимости от программного обеспечения сервера, №5 может быть исправлено. Обратитесь к документации вашего сервера по HTTP / 2 для получения дополнительной информации о том, как и когда он отправляет HTTP 421. В качестве альтернативы вы можете выпустить отдельные сертификаты для каждого домена, но это создает дополнительные административные издержки и может не стоить того. Вы также можете полностью отключить HTTP / 2, но в большинстве случаев это, вероятно, излишне.

Может, это кому-то будет полезно.

Я получил эту ошибку, когда попытался изменить конфигурацию виртуального хоста apache на HTTPS, но только изменил порт с 80 на 443 и забыл добавить

   SSLEngine on
   SSLCertificateFile "/opt/lampp/htdocs/localhost.crt"
   SSLCertificateKeyFile "/opt/lampp/htdocs/localhost.key"

Конфигурация, вызывающая ошибку 421:

<VirtualHost mydoamin.local:443>   <-- fistly I 
       DocumentRoot "/opt/lampp/htdocs/mydomain/"
       ServerName www.mydomain.local
</VirtualHost>

Правильная конфигурация:

<VirtualHost mydoamin.local:443>
       DocumentRoot "/opt/lampp/htdocs/mydomain/"
       ServerName www.mydomain.local
       SSLEngine on
       SSLCertificateFile "/opt/lampp/htdocs/localhost.crt"
       SSLCertificateKeyFile "/opt/lampp/htdocs/localhost.key"
</VirtualHost>

Мы наблюдали ту же проблему с Safari (настольный компьютер и iPhone) на некоторых веб-сайтах, использующих Debian 10 с Apache.

Программное обеспечение:

  • Debian 10
  • Apache2 2.4.38-3 + deb10u3 с HTTP / 2
  • PHP 7.3.14-1 ~ deb10u1 с php-fpm

Домены:

  • www.example.com
  • a.example.com
  • b.example.com
  • все домены указывают на один и тот же DocumentRoot

Сертификат:

  • Один сертификат для всех используемых доменов
  • Эмитент DFN PKI

Решение было довольно простым, но потребовалось много усилий, чтобы его найти. В конце концов, это была пробная ошибка.

Конфигурация, вызывающая ошибку 421:

    # in /etc/apache2/site-enabled/www.example.com.conf
    SSLCertificateFile      /etc/apache2/ssl/www.example.com/cert-123.pem
    SSLCertificateKeyFile   /etc/apache2/ssl/www.example.com/www.example.com.key

    # in /etc/apache2/site-enabled/a.example.com.conf
    SSLCertificateFile      /etc/apache2/ssl/a.example.com/cert-123.pem
    SSLCertificateKeyFile   /etc/apache2/ssl/a.example.com/www.example.com.key

    # in /etc/apache2/site-enabled/b.example.com.conf
    SSLCertificateFile      /etc/apache2/ssl/b.example.com/cert-123.pem
    SSLCertificateKeyFile   /etc/apache2/ssl/b.example.com/www.example.com.key

Рабочая конфигурация:

    # in /etc/apache2/site-enabled/www.example.com.conf
    SSLCertificateFile      /etc/apache2/ssl/www.example.com/cert-123.pem
    SSLCertificateKeyFile   /etc/apache2/ssl/www.example.com/www.example.com.key

    # in /etc/apache2/site-enabled/a.example.com.conf
    SSLCertificateFile      /etc/apache2/ssl/www.example.com/cert-123.pem
    SSLCertificateKeyFile   /etc/apache2/ssl/www.example.com/www.example.com.key

    # in /etc/apache2/site-enabled/b.example.com.conf
    SSLCertificateFile      /etc/apache2/ssl/www.example.com/cert-123.pem
    SSLCertificateKeyFile   /etc/apache2/ssl/www.example.com/www.example.com.key

Решение (в нашем случае): нельзя копировать один и тот же сертификат и закрытый ключ в разные места!

Раньше мы копировали сертификат в каталог VirtualHost. Это приводит к Неверный запрос поведение только с Safari.

К сожалению, я не могу вам объяснить, почему :-( (ошибка Apache2? Ошибка Safari? Функция Safari?)

Я была такая же проблема. Переключение на два однослотовых SSL помогло.