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

11

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

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

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

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

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

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

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

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

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

ОБНОВЛЕНИЕ Хорошо, почти пару лет спустя и решил, что пришло время иметь дело с этим. Я смог решить большинство проблем, удалив мои статические домены, которые обслуживали изображения и JavaScript. Тем не менее, я все еще использовал второй домен для некоторых из этого контента, и Safari, в частности, все еще доставлял мне проблемы.

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

mseifert
источник
Размещаете ли вы несколько веб-сайтов на одном сервере Apache И используете один и тот же сертификат SSL И возникает ли ошибка при переключении между этими доменными именами?
Джон Хэнли,
Если ответ «ДА», проверьте, соответствует ли IP-адрес каждого домена тому же виртуальному серверу. Если ДА, то у вас есть два варианта (о которых я могу подумать): 1) Выпускать отдельные сертификаты SSL для каждого доменного имени. 2) Переместите веб-серверы для каждого домена на разные серверы (разные IP-адреса). Учитывая, что вы находитесь на виртуальном хостинге, вариант 1, вероятно, является лучшим решением. Вы можете протестировать это решение, используя Let's Encrypt, чтобы выпустить несколько бесплатных сертификатов для установки на другие веб-серверы.
Джон Хэнли,
Спросите у своего хостинг-провайдера, могут ли они отключить mod_http2.
Джон Хэнли,
@JohnHanley - re # 1, да, это тот же SSL с 6 доменами в нем. Нелегко точно сказать, когда происходит ошибка. Основной сценарий состоит в том, что я нахожусь на одном домене, извлекая контент (изображения и js) из двух других доменов. Re # 2: IP-адрес определенно тот же - я собираю выдачу отдельных сертификатов, каждое доменное имя будет гораздо дороже. Я посмотрел на Let's Encrypt, но он не поддерживается моим провайдером. В течение последних 6 месяцев мой провайдер предлагал бесплатные сертификаты, поэтому, когда в этом месяце произойдет обновление, я переключусь и посмотрю, что произойдет. Re # 3 - они не могут отключить mod_http2. Спасибо
mseifert
На самом деле, все провайдеры поддерживают Let's Encrypt, если они специально не блокируют его. Сертификаты SSL одинаковы, независимо от того, где вы их получаете. Единственная разница - это тип проверки (DV, OV, EV) и формат / формат файла. Apache настолько популярен, что их поддерживают все. Пока ваш поставщик поддерживает загрузку вашего собственного сертификата (сертификата и закрытого ключа), вы можете использовать проверку DNS, чтобы обойти их. Если они не поддерживают загрузку вашего собственного сертификата, я бы поменял поставщиков.
Джон Хенли

Ответы:

14

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

  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 говорит , что клиент может повторить попытку, не то, что он должен или MUST. Неудачная попытка не особенно удобна для пользователя, но может быть желательна для средства отладки или библиотеки HTTP.

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

Kevin
источник
У меня есть многодоменный сертификат Comodo PositiveSSL, который действительно является одним сертификатом SSL. Переход к отдельным сертификатам является значительным усилием и / или расходом на данный момент. Основные проблемы возникали при попытке создать статические домены без файлов cookie для обслуживания моих изображений. Это не стоило того количества 421, которое я получал. В настоящее время я отключил статические домены. У меня все еще есть некоторое распределение ресурсов между доменами, но число 421 резко упало. В настоящее время не стоит предполагаемой эффективности. Когда-нибудь я проверю вашу рекомендацию, когда у меня будет больше времени.
mseifert
Спасибо за подробное объяснение. Хотя это довольно раздражающая проблема (и вы в основном замечаете ее только при использовании Safari), я нахожу цепочку событий, которые приводят к этой проблеме, довольно интересной :)
fritzmg
1

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

Я получил эту ошибку, когда попытался изменить конфигурацию виртуального хоста 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>
Радек Данилюк
источник
-1

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

Оливье
источник