किसी web.config फ़ाइल का उपयोग करके HTTPS को कैसे बाध्य करें


220

मैंने इसके समाधान का प्रयास करने के लिए Google और StackOverflow के आसपास खोज की है, लेकिन वे सभी ASP.NET आदि से संबंधित हैं।

मैं आमतौर पर अपने सर्वर पर लिनक्स चलाता हूं, लेकिन इस एक क्लाइंट के लिए मैं आईआईएस 7.5 (और प्लस्क 10) के साथ विंडोज का उपयोग कर रहा हूं। यही कारण है कि मैं IIS और web.config फ़ाइलों से थोड़ा अपरिचित हूं । एक .htaccessफ़ाइल में आप प्रोटोकॉल का पता लगाने के लिए पुन: लिखने की स्थिति का उपयोग कर सकते हैं कि प्रोटोकॉल HTTPS है या तदनुसार पुनर्निर्देशित। क्या वेब.कॉन्फ़िग फ़ाइल का उपयोग करके या यहां तक कि मेरे द्वारा स्थापित ' URL रीराइट ' मॉड्यूल का उपयोग करके इसे प्राप्त करने का एक सरल तरीका है ?

मुझे ASP.NET का कोई अनुभव नहीं है इसलिए यदि यह समाधान में शामिल है तो कृपया इसे लागू करने के स्पष्ट चरणों को शामिल करें।

मुझे web.config के साथ ऐसा करने के लिए कारण और नहीं पीएचपी कि मैं साइट के भीतर सभी परिसंपत्तियों पर HTTPS को बलपूर्वक लागू करना चाहते हैं।



जवाबों:


427

आपको URL पुनर्लेखन मॉड्यूल की आवश्यकता है, अधिमानतः v2 (मेरे पास कोई v1 स्थापित नहीं है, इसलिए यह गारंटी नहीं दे सकता है कि यह वहां काम करेगा, लेकिन यह होना चाहिए)।

यहाँ ऐसे web.config का एक उदाहरण दिया गया है - यह HTTPS को सभी संसाधनों के लिए बाध्य करेगा (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 इस विशेष समाधान का ASP.NET/PHP या किसी अन्य तकनीक से कोई लेना-देना नहीं है क्योंकि यह केवल URL पुनर्लेखन मॉड्यूल का उपयोग करके किया गया है - यह प्रारंभिक / निचले स्तरों में से एक पर संसाधित होता है - अनुरोध से पहले बिंदु पर पहुंच जाता है जहां आपका कोड होता है निष्पादित हो जाता है।


6
@BenCarey आपको Strict-Transport-Securityशीर्षलेख को भी देखना चाहिए : en.wikipedia.org/wiki/HTTP_Strict_Transport_Security
LazyOne

22
मैं रीडायरेक्ट को बदलने की सलाह देता हूं ताकि यह क्वेरी स्ट्रिंग को जोड़ न दे क्योंकि यह पहले से ही {REQUEST_URI} का हिस्सा है (अन्यथा पैरामीटर दो बार जुड़ जाते हैं)। <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" />
फ्रेंजो

6
यह काम करता है, लेकिन दुर्भाग्य से लोकलहोस्ट पर भी। इससे बचने के लिए आप इसे <शर्तों>: <ऐड इनपुट = "{HTTP_HOST}" पैटर्न = "लोकलहोस्ट"
नकारात्मक

5
एडब्ल्यूएस लचीला बीनस्टॉक का उपयोग करना, इस विधि मुझे एक 302 बहुत सारे रीडायरेक्ट दे रहा था जब तक मैं संशोधित: <match url=".*"/>करने के लिए<match url="http://*.*" />
केविन आर

1
@Sam शायद आपके पास URL रिवाइट मॉड्यूल स्थापित नहीं है? यह डिफ़ॉल्ट रूप से IIS के साथ नहीं आता है, इसे अलग से स्थापित करने की आवश्यकता है। जैसे docs.microsoft.com/en-us/iis/extensions/url-rewrite-module/…
LazyOne

80

ASP.NET MVC का उपयोग करने वालों के लिए। आप HTTPS होने के लिए सभी प्रतिक्रियाओं को बाध्य करने के लिए EssentialHttpsAttribute का उपयोग कर सकते हैं :

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

अन्य चीजें जो आप अपनी साइट को सुरक्षित करने में मदद करना चाहते हैं:

  1. एसएसएल / टीएलएस का उपयोग करने के लिए फोर्स एंटी-फोर्जरी टोकन:

    AntiForgeryConfig.RequireSsl = true;
  2. Web.config फ़ाइल को बदलकर डिफ़ॉल्ट रूप से HTTPS के लिए कुकीज़ की आवश्यकता होती है:

    <system.web>
        <httpCookies httpOnlyCookies="true" requireSSL="true" />
    </system.web>
  3. NWebSec.Owin NuGet पैकेज का उपयोग करें और साइट पर सख्त परिवहन सुरक्षा (HSTS) को सक्षम करने के लिए कोड की निम्नलिखित पंक्ति जोड़ें। नीचे दिए गए प्रीलोड निर्देश को जोड़ना न भूलें और अपनी साइट को एचएसटीएस प्रीलोड साइट पर जमा करें । अधिक जानकारी यहाँ और यहाँ । ध्यान दें कि यदि आप OWIN का उपयोग नहीं कर रहे हैं, तो एक Web.config विधि है जिसे आप NWebSec साइट पर पढ़ सकते हैं ।

    // app is your OWIN IAppBuilder app in Startup.cs
    app.UseHsts(options => options.MaxAge(days: 720).Preload());
  4. NWebSec.Owin NuGet पैकेज का उपयोग करें और साइट पर सार्वजनिक कुंजी पिनिंग (HPKP) को सक्षम करने के लिए कोड की निम्न पंक्ति जोड़ें। अधिक जानकारी यहाँ और यहाँ

    // 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. किसी भी URL के उपयोग में https स्कीम शामिल करें। जब आप कुछ ब्राउज़रों में स्कीम की नकल करते हैं तो कंटेंट सिक्योरिटी पॉलिसी (CSP) HTTP हेडर और सबसोर्स इंटीग्रिटी (SRI) अच्छा नहीं चलता है। HTTPS के बारे में स्पष्ट होना बेहतर है। जैसे

    <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.4/bootstrap.min.js">
    </script>
  6. इस सब के साथ एक परियोजना उत्पन्न करने के लिए ASP.NET MVC बॉयलरप्लेट विजुअल स्टूडियो प्रोजेक्ट टेम्पलेट का उपयोग करें और बहुत अधिक बिल्ट इन। आप GitHub पर कोड भी देख सकते हैं ।


4
प्रश्न ASP.NET के लिए पूछता है, लेकिन WebForms या MVC को नहीं बताता है, इसलिए मैंने MVC (जो HTTPS को लागू करने के लिए Web.config फ़ाइल का उपयोग नहीं करता है) और अभी तक ... के लिए एक व्यापक उत्तर दिया है।
मुहम्मद रेहान सईद

6
a) समाधान काम करता है लेकिन चीजें बदल गई हैं, यह प्रमुख, उच्च श्रेणी निर्धारण प्रश्न एक अद्यतन उत्तर के योग्य है जो MVC में बनाया गया है। बी) जवाब सभी ठिकानों को कवर करने की कोशिश करता है। यह सवाल सरल नहीं है, एक पूरी साइट पर HTTPS को सक्षम करने के लिए web.config फ़ाइल को बदलने की तुलना में बहुत अधिक आवश्यकता होती है। पाठकों को यह सोचकर गुमराह किया जा सकता है कि वेब.कॉन्फ़िग फ़ाइल में यह सब है। सुरक्षा काफी कठिन है क्योंकि यह अपूर्ण / पुराने उत्तरों के बिना है।
मुहम्मद रेहान सईद

11
मेरी राय में यह एक उत्कृष्ट और मूल्यवान उत्तर है। जब कोई व्यक्ति इस विषय को बताता है और इस प्रश्न पर निर्देशित होता है तो मुझे खुशी है कि आपका उत्तर यहाँ है।
राष्ट्रपति जेम्स के। पोल्क

1
@MuhammadRehanSaeed अच्छी पोस्ट। शायद आपकी सूची में SRI जोड़ें? scotthelme.co.uk/subresource-integrity
नाथन

1
सच @MuhammadRehanSaeed - मुझे लगता है कि "अन्य चीजें आप भी मदद करने के लिए अपनी साइट को सुरक्षित कर सकते हैं" अपने शीर्षक बनाया मुझे इसके बारे में :) लगता है
नाथन

14

LazyOne के उत्तर को बढ़ाने के लिए, यहां उत्तर का एक एनोटेट संस्करण है।

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

इस सर्वर पर पहले से परिभाषित किए गए अन्य सभी नियम साफ़ करें। एक नया नियम बनाएं, जिसे हम "https के सभी अनुरोधों को पुनर्निर्देशित करेंगे" नाम देंगे। इस नियम को संसाधित करने के बाद, किसी भी अधिक नियम को संसाधित न करें! सभी आने वाले URL से मिलान करें। फिर जांचें कि क्या ये सभी अन्य शर्तें सही हैं: HTTPS बंद है। ठीक है, यह केवल एक शर्त है (लेकिन सुनिश्चित करें कि यह सच है)। यदि यह है, तो ग्राहक को वापस 301 परमानेंट रीडायरेक्ट भेजें http://www.foobar.com/whatever?else=the#url-contains। उस के अंत में क्वेरी स्ट्रिंग न जोड़ें, क्योंकि यह क्वेरी स्ट्रिंग को डुप्लिकेट करेगा!

यही गुण, गुण और कुछ मूल्यों का मतलब है।

  • स्पष्ट सभी सर्वर नियमों को हटा देता है जिन्हें हम अन्यथा विरासत में ले सकते हैं।
  • नियम एक नियम को परिभाषित करता है।
    • नाम एक मनमाना नियम के लिए (हालांकि अद्वितीय) नाम।
    • stopProcessing कि क्या IIS अनुरोध पाइपलाइन के लिए अनुरोध को तुरंत अग्रेषित करना है या पहले अतिरिक्त नियमों को संसाधित करना है।
  • मैच जब इस नियम को चलाने के लिए।
    • URL को मूल्यांकित करने के लिए एक प्रतिरूप
  • स्थिति जब इस नियम को चलाने के लिए के बारे में अतिरिक्त शर्तें; यदि कोई मैच होता है, तो शर्तों को संसाधित किया जाता है।
    • तार्किकग्रुपिंग कि क्या सभी शर्तें सही होनी चाहिए ( MatchAll) या किसी भी स्थिति में सही होनी चाहिए ( MatchAny); AND बनाम OR के समान।
  • add एक शर्त जोड़ता है जिसे पूरा किया जाना चाहिए।
    • इनपुट है कि एक शर्त का मूल्यांकन कर रहा है; इनपुट सर्वर चर हो सकता है।
    • उस मानक का पैटर्न जिसके खिलाफ इनपुट का मूल्यांकन करना है।
    • अनदेखा करना कि पूंजीकरण मायने रखता है या नहीं।
  • कार्रवाई क्या करना है, तो matchऔर उसके conditionsसभी सही हैं।
    • प्रकार आम तौर पर redirect(क्लाइंट-साइड) या rewrite(सर्वर-साइड) हो सकता है।
    • url इस नियम के परिणामस्वरूप क्या उत्पादन करना है; इस मामले में, https://दो सर्वर चर के साथ संक्षिप्त करें।
    • पुनर्निर्देशन क्या HTTP का उपयोग करने के लिए पुनर्निर्देशित करता है; यह एक 301 स्थायी है।
    • appendQueryString परिणामी के अंत में क्वेरी स्ट्रिंग जोड़ने के लिए urlया नहीं; इस मामले में, हम इसे गलत पर सेट कर रहे हैं, क्योंकि {REQUEST_URI}पहले से ही इसमें शामिल है।

सर्वर चर हैं

  • {HTTPS}जो OFFया तो है ON
  • {HTTP_HOST}है www.mysite.com, और
  • {REQUEST_URI} बाकी URI शामिल हैं, उदाहरण के लिए /home?key=value
    • ब्राउज़र संभालता है #fragment(LazyOne की टिप्पणी देखें)।

इन्हें भी देखें: https://www.iis.net/learn/extensions/url-rewrite-module/url-rewrite-module-configuration-reference


1
एक नोट हालांकि: URL का टुकड़ा भाग (से /home?key=value#fragment) ब्राउज़र द्वारा सर्वर पर सेट नहीं है क्योंकि इसका स्थानीय स्तर पर उपयोग करने का मतलब है।
लेजीऑन

@ आलसी प्रश्न। हम उपरोक्त web.config का सफलतापूर्वक उपयोग करके greenearth.game/about#foo से HTTPS पर पुनर्निर्देशित कर रहे हैं । HTTPS के स्विच में #foo टुकड़ा शामिल है। यह देखते हुए कि #foo का हिस्सा गंभीर को नहीं भेजा गया है, इसमें रीडायरेक्ट कैसे शामिल है?
शॉन लुटिन

यह ब्राउज़र द्वारा नियंत्रित किया जाता है। Google Chrome में बस नेटवर्क टैब खोलें (या फ़ायरफ़ॉक्स आदि में समान) और देखें कि URL वास्तव में क्या अनुरोध किया गया है (उदाहरण के लिए http://www.example.com/members#oopsअनुरोध भेजा जाएगा, http://www.example.com/membersजिसके बाद HTTPS संस्करण पर पुनर्निर्देशित हो जाता है https://www.example.com/members- ब्राउज़र बाकी काम करता है)
LazyOne

@LazyOne इसके लिए धन्यवाद। यदि मैं सही ढंग से याद करता हूं, तो कुछ WebKit बग होते हैं जो खंड को पुनर्निर्देश में शामिल करने से रोकते हैं। तो, यह समझ में आता है। Bugs.webkit.org/show_bug.cgi?id=24175
शॉन लुटिन

1
en.wikipedia.org/wiki/Fragment_identifier - "जब ग्राहक कोई दस्तावेज़ प्राप्त करते हैं, तो ग्राहक URI- टुकड़े को भेजने के लिए नहीं होते हैं, और स्थानीय एप्लिकेशन की मदद के बिना (नीचे देखें) टुकड़े HTTP पुनर्निर्देशन में भाग नहीं लेते हैं" - यदि मैं आपकी अंतिम टिप्पणी को गलत समझ लेता हूं तो बस स्पष्ट होना चाहिए।
लेज़ीऑन

6

स्वीकृत जवाब मेरे काम नहीं आया। मैंने इस ब्लॉग पर चरणों का पालन किया ।

एक महत्वपूर्ण बिंदु जो मेरे लिए गायब था, वह यह था कि मुझे IIS के लिए URL रिवाइटर टूल डाउनलोड और इंस्टॉल करना था। मैंने इसे यहां पाया । परिणाम निम्नलिखित था।

<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 कोर में, https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl पर दिए गए निर्देशों का पालन करें

अपने स्टार्टअप में। निम्नलिखित जोड़ें:

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

Https को Http पर पुनर्निर्देशित करने के लिए, स्टार्टअप में निम्न जोड़ें

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

उत्कृष्ट NWebsec लाइब्रेरी HTTP से HTTPS में आपके अनुरोधों को अपने upgrade-insecure-requestsटैग के साथ अपग्रेड कर सकती है Web.config:

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

0

मुझे अपने वातावरण में URL रीराइट स्थापित करने की अनुमति नहीं थी, इसलिए, मुझे एक और मार्ग मिला।

इसे मेरे web.config में जोड़ने से त्रुटि फिर से जुड़ गई और 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>

फिर, यहाँ सलाह का पालन करें: https://www.sslshopper.com/iis7-redirect-http-to-https.html

मैंने html फ़ाइल बनाई जो रीडायरेक्ट (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>

मुझे आशा है कि किसी को यह उपयोगी लगता है क्योंकि मुझे सभी टुकड़े एक जगह पर कहीं और नहीं मिले।


-7

एक सरल तरीका यह है कि IIS को HTTP अनुरोधों के लिए अपनी कस्टम त्रुटि फ़ाइल भेजने के लिए कहा जाए। फ़ाइल में एक मेटा रीडायरेक्ट, एक जावास्क्रिप्ट रीडायरेक्ट और लिंक के साथ निर्देश आदि हो सकते हैं। महत्वपूर्ण बात यह है कि आप अभी भी साइट (या फ़ोल्डर) के लिए "SSL की आवश्यकता" की जांच कर सकते हैं और यह काम करेगा।

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

क्यों होता है पतन? यह काम करता है और सवाल का जवाब देता है।
पुनर्निर्देशित

14
यह एक डाउन वोट है क्योंकि आप Google को बता रहे हैं कि आपकी फ़ाइल नहीं मिली है और फिर आप जावास्क्रिप्ट का उपयोग रीडायरेक्ट करने के लिए कर रहे हैं, जो आमतौर पर सिर्फ खराब होता है।
थॉमस बेनेट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.