Ubuntu

如果使用者使用http上的443埠訪問網站,如何關閉連接?

  • January 25, 2021

如果使用者訪問http://example.com:443之類的網站,我如何給使用者一個連接重置錯誤,而不是給出以下錯誤:

錯誤的請求

您的瀏覽器發送了此伺服器無法理解的請求。

原因:您對啟用 SSL 的伺服器埠使用純 HTTP。

請改用 HTTPS 方案訪問此 URL。

上面的錯誤是 Apache 提供給我不想要的使用者的。相反,我只想停止連接,而不是給出文本響應。這可能嗎,應該是,因為很多網站都有這個功能。提前致謝。(此外,我自己無法嘗試任何事情,因為我不知道它是如何工作的,所以如果可以的話,我可以自己實現它)。

在某種程度上類似,但無論如何都不能回答我的問題: Serving port 443 over http 創建 400 Bad Request Error 而不是 redirect,但提到:“如果您嘗試與其他伺服器進行此類請求,那麼他們將關閉連接而不會出現任何錯誤完全掛起,或者只是掛起,因為他們仍然希望從客戶端獲得 TLS 握手” ,所以我的問題是如果使用者訪問http://example.com:443如何關閉連接。

以防萬一:

請注意,當使用者訪問 http:// 而不是 https:// 上的埠 443 時,我想關閉連接。我不希望 apache 顯示錯誤請求消息。我想關閉連接,因為有人提到無法將 http:// 上的 443 重定向到 https://。如果有任何方法可以做到這一點,請告訴我(除了 HSTS,我不願意信任)。我認為這將使用防火牆來完成(不確定)。我也見過 cPanel 這樣做,但我沒有將 cPanel 用於其他目的,所以請不要要求我這樣做。

還:

除非您修改 Apache 的原始碼,否則無法更改 400 bad request 頁面,因此無法從 http 重定向到 https。我不認為我被允許修改 Apache 的原始碼。

我還看到執行curl http://www.google.com:443curl: (52) Empty reply from server,所以發送一個空回复應該足以停止連接對吧?我不確定。但也許是的,如果是這樣,怎麼辦?(如果有不同的連接斷開方法,請不要回答這個問題)。

需要明確的是:我要求的是sudo ufw deny out 443 http(可能無效)之類的東西。

我在 Apache 原始碼目錄中編輯了一個文件./modules/ssl/ssl_engine_kernel.so

在該文件中,您可以找到一行內容:

   if (sslconn->non_ssl_request == NON_SSL_SET_ERROR_MSG) {
       apr_table_setn(r->notes, "error-notes",
                      "Reason: You're speaking plain HTTP to an SSL-enabled "
                      "server port.<br />\n Instead use the HTTPS scheme to "
                      "access this URL, please.<br />\n");

       /* Now that we have caught this error, forget it. we are done
        * with using SSL on this request.
        */
       sslconn->non_ssl_request = NON_SSL_OK;

       return HTTP_BAD_REQUEST;
   }

請改用 HTTPS 方案訪問此 URL,請…..`。

將其更改為:

   if (sslconn->non_ssl_request == NON_SSL_SET_ERROR_MSG) {
       /*
       apr_table_setn(r->notes, "error-notes",
                      "Reason: You're speaking plain HTTP to an SSL-enabled "
                      "server port.<br />\n Instead use the HTTPS scheme to "
                      "access this URL, please.<br />\n");
       */
       /* Now that we have caught this error, forget it. we are done
        * with using SSL on this request.
        */
       sslconn->non_ssl_request = NON_SSL_OK;

       return apr_pstrcat(NULL);
   }

然後,重新編譯 Apache。你應該很好:)

有趣的。像這樣的東西怎麼樣:

<VirtualHost *:443>
   <Location />
   Order deny,allow
   Deny from all
   Allow from 127.0.0.1
   </Location>

這將拒絕除 localhost 之外的任何埠 443 的流量。

但實際上我認為您可能想要做的(?)只是將所有 http 請求重定向到 https。重定向後 443 將是多餘的。

引用自:https://serverfault.com/questions/1003526