Apache: güvenli bağlantı noktasına güvenli olmayan istek gönderildi… yönlendirmek istiyor


9

önsöz

Birincisi: Bir basitçe Liman 80 -> Liman 443 Rewrite OLMAYACAKTIR Bunu düzeltmek. Neredeyse her önceki soru, posta iş parçacığı, forum iş parçacığı, vb, ben bu ilk cahil tepki olduğunu bulduk ve birkaç kez papağan.

İkincisi: Evet, aynı bağlantı noktasında HTTP ve HTTPS trafiği sunamayacağınızı biliyorum. Bu değil.

Senaryo:

Bağlantı noktası çarpımı ile birden fazla siteyi barındıran Apache Server. 80 numaralı liman halka açık bir sitedir. Port 443, bu sitenin güvenli sürümünü sunar.

7443, 8443 ve 9443 numaralı bağlantı noktalarının her biri ayrı SSL Güvenli siteler sunar.

Bir kullanıcı URL'yi yanlış yazıyorsa veya geçerli olmayan bir bağlantı verildiyse , http: //hostname.tld: 7443 deyin , aşağıdaki gülünç sayfa verilir:

Apache Kötü İstek hata mesajı

Sunucu yerine https: //hostname.tld: 7443 adresine yönlendiriliyor .

Benim sorum , Zeus'un popo deliği adına Apache'nin davranışını veya bu hata mesajını kullanıcıyı otomatik olarak yeniden yönlendirmek için nasıl değiştirebilirsiniz?

Apache, HTTPS için yapılandırılmış olmasına rağmen https olmayan bir istek (bu hata mesajını görüntülemek için) sunuyor. Sadece varsayılan olarak yönlendirmeyi yapmak benim için oldukça aptalca görünüyor, ancak kabul etmese bile neden yaptıkları davranışa gittiklerini anlayabiliyorum. Yani sorum şu: değiştirebilir misiniz? BAZI YERDE hatayı işliyorlar ve Apache, yapılandırma cornucopia olduğu için, bu davranışı ele almak için bir yerde bazı direktifler var, ancak şimdiye kadar birkaç saat içinde bulamadım.

Güncelleme:

Ben de dahil olmak üzere çeşitli şeyler denedim:

  • ErrorDocument 400direktifleri kullanarak bir CGI ve sadece göndermek Status 301ve Locationüstbilgileri bir PHP betiği almak . Bu boş bir sayfa ile sonuçlanır. ErrorDocument 400 https://hostname.tld:7443Basitçe kullanılması , o bağlantının sayfada görüntülenmesine neden olur.

  • mod_rewriteSiteyi tamamen yönlendiren kapsamlı ifadeler de dahil olmak üzere, hemen hemen her I veya Google kombinasyonunu kullanmak ; bunlar asla işe yaramıyor. Kelimenin tam anlamıyla, hiçbir şey yapmıyorlar. Yeniden yazma yönergelerini işlemeye çalışmadan önce Apache'nin yukarıdaki hataya tekme attığını tahmin ediyorum.

Özel bağlantı noktası kullanımı nedeniyle bağlantı noktası tabanlı yönlendirmeleri kullanamıyorum. Komut dosyası tabanlı yönlendirmeleri kullanamıyorum çünkü http / https uyumsuzluğu nedeniyle hiçbir zaman sunulmuyorlar. Neredeyse bir hataya veya istenmeyen bir davranışa tebeşir vermeye hazırım, ama birileri çok özel bir hata mesajı koymak için önceden düşünmüştü, belki sadece sepete atmak isteyeceğinizi düşünmekle uğraşmadılar. URL zaten sağladıkları ?



Daniel, Bu bulduğum birçok sorudan ve bu soruyu göndermeden önce denediğim çözümlerden biriydi. Sorunun PHP bileşeni olduğunu düşünüyorum, ancak @ hrunting'in cevabı güncellemesi şu anda benim için güzel çalıştığı için, zaten sahip olduğumdan daha fazla batmayacağım; en azından ben gerekene kadar.
peelman

2
Bağlantılı video için oy ver, duygularımı mükemmel bir şekilde aktarıyor
michele b

Yanıtlar:


6

Bence bu muhtemelen Apache 2.2 ve önceki sürümlerin bu özel durumu nasıl ele aldığına dair bir hata.

SSL okuma 400 Bad Requesthatası durumunda, Apache 2.2 HTTP yanıt kodunu veya başlıklarını değil, yalnızca HTTP yanıt gövdesini döndürmez. 443 numaralı bağlantı noktasına telnetting yaparak ve göndererek test ediyorum:

GET / HTTP/1.1

Sunucu hemen geri döner (benim için):

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
Reason: You're speaking plain HTTP to an SSL-enabled server port.<br />
Instead use the HTTPS scheme to access this URL, please.<br />
<blockquote>Hint: <a href="https://server.tld/"><b>https://server.tld/</b></a></blockquote></p>
</body></html>

HTTP yanıt kodunun veya herhangi bir HTTP üstbilgisinin bulunmadığına dikkat edin.

Bunu bir Apache 2.4 sunucusuna yaptığımda şunu elde ederim:

HTTP/1.1 400 Bad Request
Date: Sun, 10 Feb 2013 00:47:23 GMT
Server: Apache/2.4.3 (Unix) OpenSSL/1.0.0g
Content-Length: 462
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
Reason: You're speaking plain HTTP to an SSL-enabled server port.<br />
Instead use the HTTPS scheme to access this URL, please.<br />
</p>
<hr>
<address>Apache/2.4.3 (Unix) OpenSSL/1.0.0g Server at server.tld Port 443</address>
</body></html>

Yaptığınız gibi bir ErrorDocument satırı kurarsam:

ErrorDocument 400 https://server.tld/

Sonra 302 yönlendirmesi için HTML alıyorum, ama yine, üstbilgilerin hiçbiri. 302 yönlendirme yanıt kodu ve Location:üstbilgisi olmadan tarayıcı yeniden yönlendirme yapmaz.

Apache 2.4'e yükseltmeyi deneyin ve çalışıp çalışmadığını görün. En azından Apache 2.4.3 ile test ettim ve onayladım, ancak tam olarak bu davranışın güncellendiğini bulma çabasına girmedim. 2.4 hazırlarken yaptıkları büyük miktarda çalışmada, istenmeyen davranışı bir yan etki olarak düzelttiklerinden şüpheleniyorum.

İlgili Apache httpd hataları:

GÜNCELLEME

Komut dosyasının üstbilgilerini (istemciye gönderilmeyecek şekilde) yazdırmasını ve ardından istediğiniz üstbilgileri el ile yazdırmasını sağlayarak, buggy Apache'yi istediğiniz davranışı (yönlendirme) vermeye zorlayabilirsiniz. İşte Apache 2.2.22 altında çalışan temel bir Perl betiği:

#!/usr/bin/perl

use strict;
use CGI;

my $q = CGI->new();

# this will cause Apache to handle the response properly, but is meaningless otherwise
print $q->redirect("https://localhost/");

# this actually performs the redirect
print "HTTP/1.1 302 Found\r\n";
print "Location: https://localhost/\r\n";
print "\r\n";

# you can do whatever you want here; this will be the HTML body

Sadece SSL olmayan bir SSL bağlantı noktasıyla konuşmanın yanı sıra 400'ün üretilmesinin başka nedenleri olduğunu da bilmelisiniz. Bunu belirlemenin kolay yolu, HTTPSortam değişkenini aramaktır. Ayarlanmışsa, SSL düzgün bir şekilde müzakere edildi ve başka bir şey 400'e neden oluyor (bu durumda çift başlık hile yapmayın). Eğer HTTPSayarlı değil, yukarıdaki gibi Yönlendirmenizi dönün.


1
Kutsal. Bok. Mükemmel cevap. Gracias.
peelman

Bunu okuduğumda, kendi kendime, "Adamım, Apache 2.2'niz varsa ve bu tür yönlendirme davranışları istiyorsanız gerçekten berbat" diye bilirsiniz. Ubuntu sistemim için uygun bir Apache 2.4 deb'i bulma (ya da kendiminkini yapma) çabasından geçmeyeceğim. Eminim PHP betiğinizden bir çözümü hackleyebilirsiniz. Apache'nin çıktıyı istemciye açıkça döktüğü için, beklenen belirli içeriği döndürürseniz, Apache'yi yükseltmeden aradığınız davranışı elde edebileceğinize eminim. PHP betiğinizin "HTTP / 1.1 302 Bulundu \ r \ nKonum: sunucu.tld \ r \ n \ r \ n" çıktısını almayı deneyin .
hrunting

Sorun PHP betiği işleniyor görünmüyor olmasıdır. Bunun şu an Ubuntu Server 12.04 üzerinde Apache 2.2.22 üzerinde oturduğunu belirtmeliyim. Ve evet, gerçekten, gerçekten berbat; özellikle de bu hata raporlarında, sadece otomatik olarak yeniden yönlendirme yapmak için bir seçenek sunmaya karşı tamamen ayarlanmış gibi göründüğünüzde ve 2.2'nin düzeltmeyi alacağına dair pek umut görünmüyor.
peelman

1
Ve yukarıda da söylediğim gibi, güvenliğe yönlendirmek yerine neden bu hata mesajını yazmakta zorluk çektiğinizi anlamıyorum (ciddi olarak, neden sadece yönlendirme değil? Ne kadar çok düşünürsem, o kadar az Bence bu kötü bir fikir).
peelman

1
Tüm dosya sistemini o kanlı mesajın metnini arayan, nereden sülük edip edemeyeceğimizi görmek için selamladım, kapalı bir şekilde bir <javascriptetiket enjekte edebilir ve bu şekilde yeniden yönlendirmeyi hacklemekle şanslı olabilirim , ama şimdiye kadar hayır zar. Bu konuda hiçbir şey aksi oldukça katı Apache awesomeness takip eden bir şekilde ele gibi görünmüyor ...
peelman

-1

Bunu mod-rewrite ile düzeltebilirsiniz. Her şeye uygun bir kural belirleyin. Bu yanıtı Stackoverflow'da görün


Hayır, zaten denedim, işe yaramıyor. ModRewrite adımlarına bile ulaşmaz, çünkü önce http / https uyumsuzluğuna çarpıyor.
peelman

Hrm bu yüzden apache config dosyanızın en üstünden başladığınızı ve ne aradığını görmek için aşağı çalıştığınızı varsayıyorum
trent

Hemen tüm sites-availabledizini ezberledim . Sadece saçmalıklara veya farklı bir siteye, farklı bağlantı noktalarına vb. Yönlendirseniz bile, 400 Kötü İstek'i yüklemeye devam eder.
peelman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.