Bir web.config dosyası kullanarak HTTPS'yi zorlama


220

Google ve StackOverflow bu konuda bir çözüm bulmaya çalışırken aradım, ama hepsi ASP.NET vb ile ilgili gibi görünüyor.

Genellikle sunucularımda Linux çalıştırıyorum, ancak bu tek istemci için Windows'u IIS 7.5 (ve Plesk 10) ile kullanıyorum. IIS ve web.config dosyalarına biraz aşina olmamın nedeni budur . Bir .htaccessdosyada, protokolün HTTPS olup olmadığını tespit etmek ve yeniden yönlendirmek için yeniden yazma koşullarını kullanabilirsiniz. Bir var mı basit yolu bu bir web.config dosyasını kullanarak, hatta 'kullanarak elde etmek için yeniden yazılan URL ben yüklediğinizi' modülünü?

Ben ASP.NET ile hiçbir deneyimi bu çözümde söz konusu ise o zaman nasıl uygulanacağı net adımlar ekleyin böylece.

PHP değil , web.config ile bunu yapmamın nedeni , site içindeki tüm varlıklarda HTTPS'yi zorlamak istememdir.



Yanıtlar:


427

URL Rewrite modülüne, tercihen v2'ye ihtiyacınız var (yüklü v1'im yok, bu yüzden orada çalışacağını garanti edemiyorum, ama olmalı).

İşte böyle bir web.config örneği - TÜM kaynaklar için HTTPS'yi zorlar (301 Kalıcı Yeniden Yönlendirme kullanarak):

<?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 Bu özel çözüm, ASP.NET/PHP veya başka bir teknoloji ile ilgisi yoktur, çünkü yalnızca URL yeniden yazma modülü kullanılarak yapılır - istek, kodunuzun bulunduğu noktaya gelmeden önce başlangıç ​​/ düşük seviyelerden birinde işlenir idam edilir.


6
@BenCarey Ayrıca şu Strict-Transport-Securitybaşlığa da bakmalısınız : en.wikipedia.org/wiki/HTTP_Strict_Transport_Security
LazyOne

22
Yönlendirmeyi, zaten {REQUEST_URI} öğesinin bir parçası olduğu için sorgu dizesini eklemeyecek şekilde değiştirmenizi öneririm (aksi takdirde parametreler iki kez eklenir). <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" />
franzo

6
Bu çalışıyor, ama ne yazık ki localhost üzerinde. Bundan kaçınmak için bunu <koşullara> ekleyebilirsiniz: <add input = "{HTTP_HOST}" pattern = "localhost"
negate

5
AWS Elastik fasulye sapı kullanarak, bu yöntem bana 302'yi değiştirene kadar çok fazla yönlendirme veriyordu: <match url=".*"/>-<match url="http://*.*" />
Kevin R.

1
@Sam Belki de URL Yeniden Yazma modülü kurulu değil? Varsayılan olarak IIS ile birlikte gelmez, ayrıca yüklenmesi gerekir. Örneğin docs.microsoft.com/tr-tr/iis/extensions/url-rewrite-module/…
LazyOne

80

ASP.NET MVC kullananlar için. Tüm yanıtları HTTPS olmaya zorlamak için RequireHttpsAttribute öğesini kullanabilirsiniz :

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

Sitenizin güvenliğini sağlamak için yapmak isteyebileceğiniz diğer şeyler:

  1. Sahtecilikle Mücadele belirteçlerini SSL / TLS kullanmaya zorla:

    AntiForgeryConfig.RequireSsl = true;
  2. Web.config dosyasını değiştirerek Tanımlama Bilgilerinin varsayılan olarak HTTPS gerektirmesini iste:

    <system.web>
        <httpCookies httpOnlyCookies="true" requireSSL="true" />
    </system.web>
    
  3. NWebSec.Owin NuGet paketini kullanın ve site genelinde Sıkı Aktarım Güvenliği'ni (HSTS) etkinleştirmek için aşağıdaki kod satırını ekleyin. Aşağıdaki Ön Yükleme yönergesini eklemeyi ve sitenizi HSTS Ön Yükleme sitesine göndermeyi unutmayın . Burada ve burada daha fazla bilgi . OWIN kullanmıyorsanız, NWebSec sitesinde okuyabileceğiniz bir Web.config yöntemi olduğunu unutmayın .

    // app is your OWIN IAppBuilder app in Startup.cs
    app.UseHsts(options => options.MaxAge(days: 720).Preload());
    
  4. NWebSec.Owin NuGet paketini kullanın ve sitede Genel Anahtar Sabitlemeyi (HPKP) etkinleştirmek için aşağıdaki kod satırını ekleyin. Burada ve burada daha fazla bilgi .

    // 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. Kullanılan URL'lere https şemasını ekleyin. İçerik Güvenlik İlkesi (CSP) HTTP üstbilgisi ve Alt Kaynak Bütünlüğü (SRI) , bazı tarayıcılarda düzeni taktığınızda iyi oynatılmıyor. HTTPS hakkında açık olmak daha iyidir. Örneğin

    <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.4/bootstrap.min.js">
    </script>
    
  6. Tüm bu ve çok daha fazla yerleşik bir proje oluşturmak için ASP.NET MVC demirbaş Visual Studio proje şablonunu kullanın. Kod GitHub üzerinde de görüntüleyebilirsiniz .


4
Soru ASP.NET için soruyor, ancak WebForms veya MVC'yi belirtmiyor, bu yüzden MVC (HTTPS'yi zorlamak için Web.config dosyasını kullanmıyor) kullananlar için kapsamlı bir cevap verdim ve henüz indirilemedi.
Muhammed Rehan Saeed

6
a) Çözüm işe yarıyor ama işler değişti, bu önemli, yüksek puanlı soru MVC'de yerleşik olanı kullanarak güncellenmiş bir cevabı hak ediyor. b) Cevap tüm üsleri kapsamayı dener. Soru basit değil, tüm site üzerinde HTTPS'yi etkinleştirmek bir web.config dosyasını değiştirmekten çok daha fazlasını gerektiriyor. Okuyucular bir Web.config dosyasını değiştirmek için gereken tek şey olabilir. Güvenlik, eksik / güncel olmayan cevaplar olmadığı için yeterince zordur.
Muhammad Rehan Saeed

11
Bence bu mükemmel ve değerli bir cevap. Birisi konuyu araştırdığında ve bu soruya yöneldiğinde, cevabınızın burada olduğuna sevindim.
Başkan James

1
@MuhammadRehanSaeed Güzel gönderi. Belki SRI listenize ekleyin? scotthelme.co.uk/subresource-integrity
Nathan

1
@MuhammadRehanSaeed true - Sanırım "Sitenizin güvenliğini sağlamak için de yapmak isteyebileceğiniz diğer şeyler" başlığınızı düşünün :)
Nathan

14

LazyOne'un cevabını arttırmak için, cevabın açıklamalı bir versiyonu.

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

Bu sunucuda önceden tanımlanmış olabilecek diğer tüm kuralları temizleyin. "Tüm istekleri https'ye yönlendir" olarak adlandırdığımız yeni bir kural oluşturun. Bu kuralı işledikten sonra, başka kuralları işlemeyin! Tüm gelen URL'lerle eşleştirin. Ardından diğer tüm koşulların doğru olup olmadığını kontrol edin: HTTPS KAPALI. Bu sadece bir koşul (ama bunun doğru olduğundan emin olun). Öyleyse, istemciye 301 Kalıcı yönlendirme gönderin http://www.foobar.com/whatever?else=the#url-contains. Sorgu dizesini sonuna eklemeyin, çünkü sorgu dizesini çoğaltır!

Özelliklerin, niteliklerin ve bazı değerlerin anlamı budur.

  • clear , başka türlü devralabileceğimiz tüm sunucu kurallarını kaldırır.
  • kural bir kuralı tanımlar.
    • isim kural için keyfi bir (gerçi benzersiz) adını.
    • stopProcess'i derhal IIS istek ardışık düzenine mi yoksa ek kuralları işlemek için mi yönlendireceğinizi işleme.
  • Bu kuralın ne zaman çalıştırılacağı ile eşleşir .
    • url URL değerlendirmek için karşı bir desen
  • koşullar bu kuralı çalıştırmak için zaman konusunda ek koşullar; Koşullar yalnızca ilk eşleşme varsa işlenir.
    • tüm koşulların true ( MatchAll) veya koşullardan herhangi birinin true ( ) olması gerekip gerekmediğini mantıksal gruplandırmaMatchAny ; vs OR benzer.
  • add , karşılanması gereken bir koşul ekler.
    • giriş , bir durum değerlendirmesi olduğu girişi; girdi sunucu değişkenleri olabilir.
    • model giriş değerlendirmek için standart karşı.
    • Büyük harf kullanımı önemli olsun ya da olmasın.
  • eylemmatch ve eğer conditionshepsi doğruysa ne yapmalı .
    • tür genellikle redirect(istemci tarafı) veya rewrite(sunucu tarafı) olabilir.
    • URL bu kuralın bir sonucu olarak ne üretmek için; bu durumda, https://iki sunucu değişkeni ile birleştirin .
    • redirectType hangi HTTP yeniden yönlendirme kullanımına; bu bir 301 Daimi.
    • appendQueryString sonuç dizesinin sonuna sorgu dizesinin eklenip eklenmeyeceği url; bu durumda, bunu false olarak ayarlıyoruz, çünkü {REQUEST_URI}zaten içeriyor.

Sunucu değişkenleri

  • {HTTPS}ya OFFda ON.
  • {HTTP_HOST}olduğu www.mysite.comve
  • {REQUEST_URI} URI'nin geri kalanını içerir, ör. /home?key=value
    • tarayıcı #fragment(LazyOne'un yorumuna bakın) işler .

Ayrıca bkz: https://www.iis.net/learn/extensions/url-rewrite-module/url-rewrite-module-configuration-reference


1
Yine de bir not: URL'nin fragman kısmı (from /home?key=value#fragment), yerel olarak kullanılması gerektiği için tarayıcılar tarafından sunucuya ayarlanmadı.
LazyOne

@LazyOne Soru. Yukarıdaki web.config dosyasını greenearth.game/about#foo'dan HTTPS'ye yönlendirmek için başarıyla kullanıyoruz . HTTPS'ye geçiş #foo parçasını içerir. #Foo bölümünün sunucuya gönderilmediği düşünüldüğünde, yönlendirme bunu nasıl içerir?
Shaun Luttin

Tarayıcı tarafından yönetilir. Sadece Google Chrome'da ağ sekmesini açın (veya Firefox'ta benzer vb.) Ve gerçekten hangi URL'nin talep edildiğini görün (örneğin, http://www.example.com/members#oopsistek için gönderilecek ve http://www.example.com/membersdaha sonra HTTPS sürümüne yönlendirilecek https://www.example.com/members- gerisini tarayıcı yapıyor)
LazyOne

@LazyOne Bunun için teşekkür ederim. Doğru hatırlıyorsam, parçanın yönlendirmelere dahil edilmesini engelleyen birkaç WebKit hatası var. Yani, bu mantıklı. bugs.webkit.org/show_bug.cgi?id=24175
Shaun Luttin

1
en.wikipedia.org/wiki/Fragment_identifier - "İstemcilerin bir belgeyi aldıklarında sunuculara URI parçaları göndermeleri ve yerel bir uygulamadan yardım almadan (aşağıya bakın) fragmanlar HTTP yeniden yönlendirmelerine katılmıyor" - son açıklamanızı yanlış anlayabileceğimde açık olmak için.
LazyOne

6

Kabul edilen cevap benim için işe yaramadı. Bu konuda adımlar takip blogda .

Benim için eksik olan önemli bir nokta, IIS için URL Yeniden Yazma Aracı'nı indirip yüklemem gerektiğiydi. Burada buldum . Sonuç şuydu.

<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

Net Core'da, https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl adresindeki talimatları izleyin.

Startup.cs dosyasında aşağıdakileri ekleyin:

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

Http'yi Https'ye yeniden yönlendirmek için, startup.cs dosyasına aşağıdakileri ekleyin

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

Mükemmel NWebsec kütüphanesi, upgrade-insecure-requestsiçindeki etiketi kullanarak isteklerinizi HTTP'den HTTPS'ye yükseltebilir Web.config:

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

0

URL Yeniden Yazmayı ortamıma yüklememe izin verilmedi, bu yüzden başka bir yol buldum.

Bunu web.config dosyasına eklemek hata yeniden yazma hatası ekledi ve IIS 7.5 üzerinde çalıştı:

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

Ardından, buradaki önerileri takip ederek: https://www.sslshopper.com/iis7-redirect-http-to-https.html

Yönlendirme yapan redtect dosyası oluşturdum (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>

Umarım birileri bunu başka bir yerde bulamadığım için faydalı bulur.


-7

Bir basit bir yolu HTTP istekleri için özel hata dosyasını göndermek için IIS anlatmaktır. Dosya daha sonra bir meta yönlendirme, bir JavaScript yönlendirmesi ve bağlantı içeren talimatlar vb. İçerebilir.

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

Downvote neden? Çalışıyor ve soruyu cevaplıyor.
yönlendirme

14
Bu, Google'a dosyanızın bulunmadığını ve daha sonra yönlendirmek için JavaScript kullandığınızı söylediğiniz için aşağı oylamadır;
Thomas Bennett
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.