Apache: yêu cầu không an toàn được gửi tới cổng an toàn, muốn chuyển hướng


9

Lời nói đầu

Thứ nhất: Một cổng 80 đơn giản -> Cổng 443 Viết lại S NOT KHÔNG sửa lỗi này. Trong hầu hết mọi câu hỏi trước đây, chủ đề thư, chủ đề diễn đàn, v.v., tôi đã thấy đây là phản hồi không biết gì đầu tiên và đã bị vẹt nhiều lần.

Thứ hai: Có, tôi biết bạn không thể phục vụ lưu lượng HTTP và HTTPS trên cùng một cổng. Đây không phải là điều đó.

Kịch bản:

Máy chủ Apache lưu trữ nhiều trang web thông qua nhân cổng. Cổng 80 phục vụ một trang web công cộng. Cổng 443 phục vụ phiên bản an toàn của trang web đó.

Các cổng 7443, 8443 và 9443 mỗi cổng phục vụ các trang web được bảo mật SSL riêng biệt.

Nếu người dùng nhập sai URL hoặc được cung cấp một liên kết không hợp lệ, hãy nói http: //hostname.tld: 7443 , họ sẽ được cung cấp trang vô lý sau:

Thông báo lỗi yêu cầu xấu của Apache

Thay vì máy chủ chỉ cần chuyển hướng chúng sang https: //hostname.tld: 7443 .

Câu hỏi của tôi là, làm thế nào mà tên của Zeus có thể sửa đổi hành vi của Apache hoặc thông báo lỗi này để chuyển hướng người dùng một cách tự động?

Apache rõ ràng đang phục vụ một yêu cầu không phải https (để hiển thị thông báo lỗi đó) mặc dù nó được cấu hình cho HTTPS. Tôi dường như rất ngu ngốc khi không chỉ thực hiện chuyển hướng theo mặc định, nhưng tôi có thể hiểu tại sao họ lại đi theo hành vi họ đã làm, ngay cả khi tôi không đồng ý với điều đó. Vì vậy, câu hỏi của tôi là: bạn có thể thay đổi nó? Họ đang xử lý lỗi SOMEWHERE và với Apache là cấu hình dồi dào, đó là lý do có một số chỉ thị ở đâu đó để xử lý hành vi này, nhưng tôi đã không thể tìm thấy nó trong vài giờ để mày mò.

Cập nhật:

Tôi đã thử nhiều thứ bao gồm:

  • sử dụng các ErrorDocument 400chỉ thị để đến CGI và tập lệnh PHP vừa gửi Status 301Locationtiêu đề. Điều này dẫn đến một trang trống. Sử dụng ErrorDocument 400 https://hostname.tld:7443chỉ đơn giản là kết quả trong liên kết đó được hiển thị trên trang.

  • Sử dụng hầu hết mọi kết hợp của mod_rewritetôi hoặc Google có thể đưa ra, bao gồm các tuyên bố về chăn chỉ đạo toàn bộ trang web; những cái này không bao giờ làm việc Theo nghĩa đen, họ không làm gì cả. Tôi đoán rằng Apache đang mắc phải lỗi trên trước khi thậm chí cố gắng xử lý các chỉ thị viết lại.

Tôi không thể sử dụng chuyển hướng dựa trên cổng, vì sử dụng cổng tùy chỉnh. Tôi không thể sử dụng các chuyển hướng dựa trên tập lệnh vì chúng không bao giờ được phục vụ do không khớp http / https. Tôi gần như sẵn sàng khắc phục lỗi này hoặc một hành vi ngoài ý muốn, nhưng ai đó đã nghĩ rằng sẽ đưa một thông báo lỗi rất tùy chỉnh vào đó, họ không bận tâm rằng có lẽ bạn chỉ muốn gửi hàng đến URL họ đã cung cấp ?



Daniel, đó là một trong nhiều câu hỏi tôi đã tìm thấy và giải pháp tôi đã thử trước khi đăng câu hỏi này. Tôi nghĩ rằng vấn đề là thành phần PHP, nhưng vì bản cập nhật câu trả lời của @ hrunting hiện đang hoạt động rất tốt đối với tôi, nên tôi sẽ không chìm sâu vào nó nhiều hơn tôi đã có; ít nhất là không cho đến khi tôi phải
Peelman

2
upvote cho video được liên kết, nó truyền tải cảm xúc của tôi một cách hoàn hảo
michele b

Câu trả lời:


6

Tôi nghĩ rằng đây có lẽ là một lỗi trong cách Apache 2.2 và thấp hơn xử lý tình huống cụ thể này.

Có vẻ như trên 400 Bad Requestlỗi đọc SSL , Apache 2.2 không trả về mã phản hồi HTTP hoặc các tiêu đề, chỉ có phần thân phản hồi HTTP. Tôi kiểm tra bằng cách dịch chuyển đến cổng 443 và gửi:

GET / HTTP/1.1

Máy chủ trả về ngay lập tức (đối với tôi):

<!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>

Lưu ý việc thiếu mã phản hồi HTTP hoặc bất kỳ tiêu đề HTTP nào.

Khi tôi làm điều này với máy chủ Apache 2.4, tôi nhận được:

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>

Nếu tôi thiết lập một dòng ErrorDocument như bạn đã làm:

ErrorDocument 400 https://server.tld/

Sau đó, tôi nhận được HTML cho chuyển hướng 302, nhưng một lần nữa, không có tiêu đề nào. Không có mã phản hồi chuyển hướng 302 và Location:tiêu đề, trình duyệt sẽ không chuyển hướng.

Hãy thử nâng cấp lên Apache 2.4 và xem nó có hoạt động không. Tôi đã thử nghiệm và xác nhận với ít nhất Apache 2.4.3, nhưng tôi chưa trải qua nỗ lực tìm kiếm chính xác khi nào hành vi này được cập nhật. Tôi nghi ngờ rằng trong số lượng lớn công việc họ đã chuẩn bị 2.4, họ đã sửa chữa hành vi không mong muốn là tác dụng phụ.

Các lỗi httpd liên quan của Apache:

CẬP NHẬT

Bạn có thể buộc một Apache lỗi để cung cấp cho bạn hành vi bạn muốn (chuyển hướng) bằng cách để tập lệnh in ra các tiêu đề của nó (sẽ không được gửi đến máy khách), sau đó in lại các tiêu đề bạn muốn. Đây là tập lệnh Perl cơ bản hoạt động theo Apache 2.2.22:

#!/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

Bạn nên lưu ý rằng có một số lý do khác có thể tạo ra 400 ngoài việc chỉ nói chuyện với cổng SSL mà không có SSL. Cách dễ dàng để xác định điều này là tìm kiếm HTTPSbiến môi trường. Nếu được đặt, SSL đã được đàm phán chính xác và một cái gì đó khác đang gây ra 400 (không thực hiện thủ thuật tiêu đề kép nếu đó là trường hợp). Nếu HTTPSkhông được đặt, trả lại chuyển hướng của bạn như trên.


1
Thánh Tào lao Câu trả lời hoàn hảo. Gracias.
Peelman

Bạn biết đấy, khi tôi đọc điều này, tôi tự nghĩ: "Trời ơi, nó thực sự tệ nếu bạn có Apache 2.2 và bạn muốn loại hành vi chuyển hướng này." Tôi sẽ không trải qua nỗ lực tìm kiếm một bản sửa lỗi Apache 2.4 phù hợp (hoặc tự tạo) cho hệ thống Ubuntu của mình. Tôi cá là bạn có thể hack một giải pháp từ tập lệnh PHP của bạn. Apache rõ ràng chỉ bán đầu ra cho khách hàng, vì vậy nếu bạn trả lại nội dung dự kiến ​​cụ thể, tôi cá là bạn có thể có được hành vi mà bạn đang tìm kiếm mà không cần nâng cấp Apache. Hãy thử để tập lệnh PHP của bạn in ra "HTTP / 1.1 302 Found \ r \ nLocation: server.tld \ r \ n \ r \ n".
hrunting

Vấn đề ở đây là có vẻ như tập lệnh PHP đang được xử lý. Tôi nên lưu ý rằng đây là phiên bản hiện tại trên Apache 2.2.22 trên Ubuntu Server 12.04. Và vâng, nó thực sự, thực sự hút; đặc biệt là khi bạn lưu ý rằng trong các báo cáo lỗi đó, chúng dường như được đặt hoàn toàn chống lại thậm chí cung cấp tùy chọn chỉ tự động thực hiện chuyển hướng và dường như không có nhiều hy vọng rằng 2.2 sẽ được sửa chữa.
Peelman

1
Và như tôi đã nói ở trên, điều đó không có nghĩa với tôi tại sao bạn gặp rắc rối khi viết thông báo lỗi đó, thay vì chuyển hướng đến an toàn (nghiêm túc, tại sao không chuyển hướng? Tôi càng nghĩ về nó, càng ít Tôi nghĩ đó là một ý tưởng tồi).
Peelman

1
Tôi đã kiểm tra toàn bộ hệ thống tập tin để tìm văn bản của tin nhắn đẫm máu đó để xem liệu tôi có thể lấy nó từ đâu không, trong trường hợp tôi có thể tiêm <javascriptthẻ và may mắn với việc hack chuyển hướng theo cách đó, nhưng cho đến nay, không xúc xắc. Không có gì về điều này dường như được xử lý theo cách tuân theo sự tuyệt vời của Apache khá cứng nhắc ...
Peelman

-1

Bạn có thể sửa lỗi này với mod-viết lại. Đặt quy tắc để phù hợp với bất cứ điều gì. Xem câu trả lời này trên Stackoverflow


Không, tôi đã thử nó, nó không hoạt động. Giống như nó thậm chí không đến các bước ModRewrite vì trước tiên, nó không khớp với http / https.
Peelman

Hrm vì vậy tôi giả sử bạn đã bắt đầu từ tập tin cấu hình apache hàng đầu của bạn và tìm đường xuống để xem nó đang gọi cái gì
trent

Tôi đã thực tế ghi nhớ toàn bộ sites-availablethư mục. Ngay cả khi bạn chỉ chuyển hướng nó thành vô nghĩa, hoặc chuyển hướng nó đến một trang web khác, cổng khác, v.v., nó vẫn tiếp tục tải 400 Yêu cầu xấu đó.
Peelman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.