Cách buộc HTTPS bằng tệp web.config


220

Tôi đã tìm kiếm xung quanh Google và StackOverflow để cố gắng tìm giải pháp cho vấn đề này, nhưng tất cả chúng dường như liên quan đến ASP.NET, v.v.

Tôi thường chạy Linux trên các máy chủ của mình nhưng với một khách hàng này, tôi đang sử dụng Windows với IIS 7.5 (và Plesk 10). Đây là lý do tại sao tôi hơi lạ lẫm với các tệp IIS và web.config . Trong một .htaccesstệp, bạn có thể sử dụng các điều kiện ghi lại để phát hiện xem giao thức có phải là HTTPS hay không và chuyển hướng phù hợp. Có cách nào đơn giản để đạt được điều này bằng cách sử dụng tệp web.config hoặc thậm chí sử dụng mô-đun ' Viết lại URL ' mà tôi đã cài đặt không?

Tôi không có kinh nghiệm với ASP.NET vì vậy nếu điều này có liên quan đến giải pháp thì vui lòng bao gồm các bước rõ ràng về cách thực hiện.

Lý do cho tôi làm điều này với web.config chứ không phải PHP là vì tôi muốn buộc HTTPS trên tất cả các tài sản trong trang web.



Câu trả lời:


427

Bạn cần mô-đun Viết lại URL, tốt nhất là v2 (Tôi chưa cài đặt v1, vì vậy không thể đảm bảo rằng nó sẽ hoạt động ở đó, nhưng nó nên).

Dưới đây là một ví dụ về web.config như vậy - nó sẽ buộc HTTPS cho TẤT CẢ tài nguyên (sử dụng Chuyển hướng vĩnh viễn 301):

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <clear />
                <rule name="Redirect to https" stopProcessing="true">
                    <match url=".*" />
                    <conditions>
                        <add input="{HTTPS}" pattern="off" ignoreCase="true" />
                    </conditions>
                    <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

PS Giải pháp cụ thể này không liên quan gì đến ASP.NET/PHP hoặc bất kỳ công nghệ nào khác vì nó chỉ được thực hiện bằng cách sử dụng mô-đun viết lại URL - nó được xử lý ở một trong các mức ban đầu / thấp hơn - trước khi yêu cầu đến điểm mà mã của bạn được thực thi.


6
@BenCarey Bạn cũng nên xem Strict-Transport-Securitytiêu đề: en.wikipedia.org/wiki/HTTP_Strict_Transport_Security
LazyOne

22
Tôi khuyên bạn nên thay đổi chuyển hướng để nó không nối chuỗi truy vấn vì nó đã là một phần của {REQUEST_URI} (nếu không, các tham số sẽ được thêm hai lần). <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" />
franzo

6
Điều này hoạt động, nhưng không may cũng trên localhost. Để tránh điều này, bạn có thể thêm phần này vào <điều kiện>: <add input = "{HTTP_HOST}" pattern = "localhost" negate = "true" />
wezzix

5
Sử dụng cây đậu đàn hồi AWS, phương pháp này đã mang lại cho tôi 302 Quá nhiều chuyển hướng cho đến khi tôi sửa đổi: <match url=".*"/>thành<match url="http://*.*" />
Kevin R.

1
@Sam Có lẽ bạn chưa cài đặt mô-đun Rewrite URL? Nó không đi kèm với IIS theo mặc định, cần phải được cài đặt riêng. Ví dụ: docs.microsoft.com/en-us/iis/extensions/url-rewrite-module/ khăn
LazyOne 26/07/19

80

Đối với những người sử dụng ASP.NET MVC. Bạn có thể sử dụng RequireHttpsAttribution để buộc tất cả các phản hồi phải là HTTPS:

GlobalFilters.Filters.Add(new RequireHttpsAttribute());

Những điều khác bạn cũng có thể muốn làm để giúp bảo mật trang web của mình:

  1. Buộc các mã thông báo chống giả mạo sử dụng SSL / TLS:

    AntiForgeryConfig.RequireSsl = true;
  2. Yêu cầu Cookies yêu cầu HTTPS theo mặc định bằng cách thay đổi tệp Web.config:

    <system.web>
        <httpCookies httpOnlyCookies="true" requireSSL="true" />
    </system.web>
    
  3. Sử dụng các NWebSec.Owin gói NuGet và thêm dòng mã sau đây để cho phép Strict Transport Security (HSTS) trên trang web. Đừng quên thêm chỉ thị Tải trước bên dưới và gửi trang web của bạn đến trang web Tải trước HSTS . Thêm thông tin ở đâyở đây . Lưu ý rằng nếu bạn không sử dụng OWIN, có một phương pháp Web.config bạn có thể đọc trên trang web của NAebSec .

    // app is your OWIN IAppBuilder app in Startup.cs
    app.UseHsts(options => options.MaxAge(days: 720).Preload());
    
  4. Sử dụng gói Nuebet của NWebSec.Owin và thêm dòng mã sau đây để bật Ghim khóa công khai (HPKP) trên trang web. Thêm thông tin ở đâyở đây .

    // app is your OWIN IAppBuilder app in Startup.cs
    app.UseHpkp(options => options
        .Sha256Pins(
            "Base64 encoded SHA-256 hash of your first certificate e.g. cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs=",
            "Base64 encoded SHA-256 hash of your second backup certificate e.g. M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE=")
        .MaxAge(days: 30));
    
  5. Bao gồm lược đồ https trong bất kỳ URL nào được sử dụng. Chính sách bảo mật nội dung (CSP) Tiêu đề HTTP và tính toàn vẹn nguồn phụ (SRI) không hoạt động tốt khi bạn bắt chước lược đồ trong một số trình duyệt. Tốt hơn là nên nói rõ về HTTPS. ví dụ

    <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.4/bootstrap.min.js">
    </script>
    
  6. Sử dụng mẫu dự án ASP.NET MVC Boilerplate Visual Studio để tạo một dự án với tất cả những thứ này và được tích hợp nhiều hơn nữa. Bạn cũng có thể xem mã trên GitHub .


4
Câu hỏi yêu cầu ASP.NET nhưng không nêu WebForms hoặc MVC, vì vậy tôi đã đưa ra câu trả lời toàn diện cho những người sử dụng MVC (Không sử dụng tệp Web.config để buộc HTTPS) và ... bị hạ cấp.
Muhammad Rehan Saeed

6
a) Giải pháp hoạt động nhưng mọi thứ đã thay đổi, câu hỏi nổi bật, được đánh giá cao này xứng đáng có câu trả lời cập nhật bằng cách sử dụng những gì được tích hợp trong MVC. b) Câu trả lời cố gắng bao gồm tất cả các cơ sở. Câu hỏi không đơn giản, việc kích hoạt HTTPS trên toàn bộ trang web đòi hỏi nhiều hơn là thay đổi tệp web.config. Người đọc có thể bị nhầm lẫn khi nghĩ rằng thay đổi tệp Web.config là tất cả những gì nó cần. Bảo mật là đủ khó vì nó không có câu trả lời không đầy đủ / lỗi thời.
Muhammad Rehan Saeed

11
Theo tôi đây là một câu trả lời xuất sắc và có giá trị. Khi ai đó googled chủ đề và được hướng đến câu hỏi này, tôi rất vui vì câu trả lời của bạn ở đây.
Tổng thống James K. Polk

1
@MuhammadRehanSaeed Bài đăng hay. Có thể thêm SRI vào danh sách của bạn? scotthelme.co.uk/subresource-integrity
Nathan

1
@MuhammadRehanSaeed đúng - Tôi đoán tiêu đề của bạn về "Những việc khác bạn cũng có thể muốn làm để bảo vệ trang web của mình" khiến tôi nghĩ về nó :)
Nathan

14

Để tăng thêm câu trả lời của LazyOne, đây là phiên bản chú thích của câu trả lời.

<rewrite>
  <rules>
     <clear />
     <rule name="Redirect all requests to https" stopProcessing="true">
       <match url="(.*)" />
         <conditions logicalGrouping="MatchAll">
           <add input="{HTTPS}" pattern="off" ignoreCase="true" />
         </conditions>
         <action 
            type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" 
            redirectType="Permanent" appendQueryString="false" />
     </rule>
  </rules>
</rewrite>

Xóa tất cả các quy tắc khác có thể đã được xác định trên máy chủ này. Tạo quy tắc mới, chúng tôi sẽ đặt tên là "Chuyển hướng tất cả các yêu cầu sang https". Sau khi xử lý quy tắc này, không xử lý thêm quy tắc nào! Khớp tất cả các URL đến. Sau đó kiểm tra xem tất cả các điều kiện khác có đúng không: HTTPS được TẮT. Chà, đó chỉ là một điều kiện (nhưng chắc chắn là đúng). Nếu có, hãy gửi chuyển hướng 301 Thường trực trở lại máy khách tại http://www.foobar.com/whatever?else=the#url-contains. Đừng thêm chuỗi truy vấn vào cuối đó, vì nó sẽ nhân đôi chuỗi truy vấn!

Đây là ý nghĩa của các thuộc tính, thuộc tính và một số giá trị.

  • xóa loại bỏ tất cả các quy tắc máy chủ mà chúng ta có thể kế thừa.
  • quy tắc xác định một quy tắc.
    • đặt tên một tên tùy ý (mặc dù duy nhất) cho quy tắc.
    • dừng việc xử lý chuyển tiếp yêu cầu ngay lập tức đến đường dẫn yêu cầu IIS hay trước tiên để xử lý các quy tắc bổ sung.
  • phù hợp khi chạy quy tắc này.
    • url một mẫu để đánh giá URL
  • điều kiện bổ sung điều kiện về thời điểm chạy quy tắc này; điều kiện chỉ được xử lý nếu có trận đấu đầu tiên.
    • logicGrouping cho dù tất cả các điều kiện phải đúng ( MatchAll) hoặc bất kỳ điều kiện nào phải đúng ( MatchAny); tương tự AND vs OR.
  • thêm thêm một điều kiện phải được đáp ứng.
    • đầu vào đầu vào mà một điều kiện đang đánh giá; đầu vào có thể là biến máy chủ.
    • mô hình chuẩn để đánh giá đầu vào.
    • bỏ qua cho dù vốn hóa có vấn đề hay không.
  • hành động phải làm gì nếu matchconditionstất cả đều đúng.
    • loại thường có thể là redirect(phía máy khách) hoặc rewrite(phía máy chủ).
    • url những gì để sản xuất như là kết quả của quy tắc này; trong trường hợp này, nối https://với hai biến máy chủ.
    • redirectType những gì HTTP chuyển hướng để sử dụng; cái này là 301 vĩnh viễn.
    • appendQueryString có thêm chuỗi truy vấn vào cuối kết quả urlhay không; trong trường hợp này, chúng tôi đang đặt nó thành false, vì {REQUEST_URI}đã bao gồm nó.

Các biến máy chủ là

  • {HTTPS}đó là OFFhoặc ON.
  • {HTTP_HOST}www.mysite.com, và
  • {REQUEST_URI} bao gồm phần còn lại của URI, vd /home?key=value
    • trình duyệt xử lý #fragment(xem bình luận từ LazyOne).

Xem thêm: https://www.iis.net/learn/extensions/url-rewrite-module/url-rewrite-module-configuration-reference


1
Mặc dù vậy, một lưu ý: một phần của URL (từ /home?key=value#fragment) không được đặt cho máy chủ bởi các trình duyệt vì nó có nghĩa là được sử dụng cục bộ.
LazyOne

@LazyOne Câu hỏi. Chúng tôi đang sử dụng web.config ở trên thành công để chuyển hướng từ greenearth.game/about#foo sang HTTPS. Việc chuyển sang HTTPS bao gồm đoạn #foo. Cho rằng phần #foo không được gửi đến máy chủ, làm thế nào để chuyển hướng bao gồm nó?
Shaun Luttin

Nó được xử lý bởi trình duyệt. Chỉ cần mở tab mạng trong Google Chrome (hoặc tương tự trong Firefox, v.v.) và xem URL nào thực sự được yêu cầu (ví dụ: http://www.example.com/members#oopsyêu cầu sẽ được gửi tới http://www.example.com/membersphiên bản HTTPS tại https://www.example.com/members- trình duyệt còn lại)
LazyOne

@LazyOne Cảm ơn bạn vì điều đó. Nếu tôi nhớ lại một cách chính xác, có một vài lỗi WebKit ngăn không cho đoạn được đưa vào các chuyển hướng. Vì vậy, điều này có ý nghĩa. bug.webkit.org/show_orms.cgi?id=24175
Shaun Luttin

1
vi.wikipedia.org/wiki/Fragment_identifier - "Khách hàng không được phép gửi các đoạn URI đến máy chủ khi họ truy xuất tài liệu và không có sự trợ giúp từ một ứng dụng cục bộ (xem bên dưới) các đoạn không tham gia vào chuyển hướng HTTP" - chỉ để rõ ràng trong trường hợp tôi hiểu nhầm bình luận cuối cùng của bạn.
LazyOne

6

Câu trả lời được chấp nhận không làm việc cho tôi. Tôi đã làm theo các bước trên blog này .

Một điểm quan trọng còn thiếu đối với tôi là tôi cần tải xuống và cài đặt Công cụ Viết lại URL cho IIS. Tôi tìm thấy nó ở đây . Kết quả là như sau.

<rewrite>
        <rules>
            <remove name="Http to Https" />
            <rule name="Http to Https" enabled="true" patternSyntax="Wildcard" stopProcessing="true">
                <match url="*" />
                <conditions>
                    <add input="{HTTPS}" pattern="off" />
                </conditions>
                <serverVariables />
                <action type="Redirect" url="https://{HTTPS_HOST}{REQUEST_URI}" />
            </rule>
        </rules>
    </rewrite>

1

Trong .Net Core, hãy làm theo các hướng dẫn tại https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl

Trong startup.cs của bạn thêm vào như sau:

// Requires using Microsoft.AspNetCore.Mvc;
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<MvcOptions>(options =>
    {
        options.Filters.Add(new RequireHttpsAttribute());
    });`enter code here`

Để chuyển hướng http đến Https, hãy thêm phần sau vào phần khởi động.

// Requires using Microsoft.AspNetCore.Rewrite;
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    var options = new RewriteOptions()
       .AddRedirectToHttps();

    app.UseRewriter(options);

0

Thư viện NWebsec tuyệt vời có thể nâng cấp các yêu cầu của bạn từ HTTP lên HTTPS bằng cách sử dụng upgrade-insecure-requeststhẻ của nó trong Web.config:

<nwebsec>
  <httpHeaderSecurityModule>
    <securityHttpHeaders>
      <content-Security-Policy enabled="true">
        <upgrade-insecure-requests enabled="true"  />
      </content-Security-Policy>
    </securityHttpHeaders>
  </httpHeaderSecurityModule>
</nwebsec>

0

Tôi không được phép cài đặt URL Rewrite trong môi trường của mình, vì vậy, tôi đã tìm thấy một đường dẫn khác.

Thêm phần này vào web.config của tôi đã thêm lỗi viết lại và hoạt động trên IIS 7.5:

<system.webServer>
    <httpErrors errorMode="Custom" defaultResponseMode="File" defaultPath="C:\WebSites\yoursite\" >    
    <remove statusCode="403" subStatusCode="4" />
    <error statusCode="403" subStatusCode="4" responseMode="File" path="redirectToHttps.html" />
</httpErrors>

Sau đó, làm theo lời khuyên ở đây: https://www.sslshopper.com/iis7-redirect-http-to-https.html

Tôi đã tạo tệp html thực hiện chuyển hướng (redirectToHttps.html):

<html>
<head><title>Redirecting...</title></head>
<script language="JavaScript">
function redirectHttpToHttps()
{
    var httpURL= window.location.hostname + window.location.pathname + window.location.search;
    var httpsURL= "https://" + httpURL;
    window.location = httpsURL;
}
redirectHttpToHttps();
</script>
<body>
</body>
</html>

Tôi hy vọng ai đó thấy điều này hữu ích vì tôi không thể tìm thấy tất cả các mảnh ở một nơi khác.


-7

Một cách đơn giản là yêu cầu IIS gửi tệp lỗi tùy chỉnh của bạn cho các yêu cầu HTTP. Sau đó, tệp có thể chứa chuyển hướng meta, chuyển hướng JavaScript và hướng dẫn có liên kết, v.v ... Quan trọng, bạn vẫn có thể kiểm tra "Yêu cầu SSL" cho trang web (hoặc thư mục) và điều này sẽ hoạt động.

</configuration>
</system.webServer>
    <httpErrors>
        <clear/>
        <!--redirect if connected without SSL-->
        <error statusCode="403" subStatusCode="4" path="errors\403.4_requiressl.html" responseMode="File"/>
    </httpErrors>
</system.webServer>
</configuration>

Tại sao là downvote? Nó hoạt động và trả lời câu hỏi.
chuyển hướng

14
Đây là một cuộc bỏ phiếu vì bạn đang nói với Google rằng tệp của bạn không được tìm thấy và sau đó bạn đang sử dụng JavaScript để chuyển hướng, điều này thường rất tệ.
Thomas Bennett
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.