IIS 7 वेब सर्वर पर HTTP स्ट्रक्ट ट्रांसपोर्ट सिक्योरिटी को चालू करने का सबसे अच्छा तरीका क्या है ?
क्या मैं सिर्फ GUI के माध्यम से और उचित HTTP प्रतिक्रिया हेडर जोड़ सकता हूं या क्या मुझे appcmd का उपयोग करना चाहिए और यदि ऐसा है तो क्या होगा?
IIS 7 वेब सर्वर पर HTTP स्ट्रक्ट ट्रांसपोर्ट सिक्योरिटी को चालू करने का सबसे अच्छा तरीका क्या है ?
क्या मैं सिर्फ GUI के माध्यम से और उचित HTTP प्रतिक्रिया हेडर जोड़ सकता हूं या क्या मुझे appcmd का उपयोग करना चाहिए और यदि ऐसा है तो क्या होगा?
जवाबों:
IIS में कस्टम हेडर को प्रतिक्रियाओं में जोड़ने की क्षमता है । यह इसके बारे में जाने का सबसे आसान तरीका प्रतीत होगा।
IIS.net पर प्रलेखन के अनुसार आप IIS प्रबंधक के माध्यम से इन शीर्षकों को जोड़ सकते हैं:
- कनेक्शन फलक में, साइट, एप्लिकेशन या निर्देशिका पर जाएं जिसके लिए आप एक कस्टम HTTP शीर्ष लेख सेट करना चाहते हैं।
- मुख पृष्ठ में, HTTP प्रतिसाद शीर्ष लेख पर डबल-क्लिक करें।
- HTTP प्रतिसाद हेडर्स फलक में, क्रियाएँ फलक में जोड़ें ... पर क्लिक करें।
- कस्टम HTTP प्रतिक्रिया शीर्ष लेख जोड़ें संवाद बॉक्स में, अपने कस्टम हेडर के लिए नाम और मान सेट करें और फिर ठीक पर क्लिक करें।
यह हमें HTTP पुनर्निर्देशित दोनों को संभालने और एक IIS साइट (URL रिवाइटर मॉड्यूल को स्थापित करने के लिए HTTPS प्रतिक्रियाओं के साथ सख्त-परिवहन-सुरक्षा हेडर को जोड़ने की अनुमति देता है):
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="HTTP to HTTPS redirect" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{HTTPS}" pattern="off" ignoreCase="true" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}"
redirectType="Permanent" />
</rule>
</rules>
<outboundRules>
<rule name="Add Strict-Transport-Security when HTTPS" enabled="true">
<match serverVariable="RESPONSE_Strict_Transport_Security"
pattern=".*" />
<conditions>
<add input="{HTTPS}" pattern="on" ignoreCase="true" />
</conditions>
<action type="Rewrite" value="max-age=31536000; includeSubDomains; preload" />
</rule>
</outboundRules>
</rewrite>
</system.webServer>
</configuration>
<action type="Rewrite" value="max-age=31536000 ;includeSubDomains; preload" />
पाने के लिए
https://somedomain.com/https://somedomain.com/relatedpath
और परिणाम बंद हो जाता है।
Voretaq7 के उत्तर को पूरक करने के लिए , आप Web.config फ़ाइल (NB :) का उपयोग केवल SSL साइटों के लिए भी कर सकते हैं, क्योंकि यह HTTP और HTTPS दोनों प्रतिक्रियाओं के लिए हैडर जोड़ देगा, जो RFC 9797 विनिर्देश के विरुद्ध है, कृपया नीचे दी गई व्याख्या देखें) - एक ब्लॉक इस प्रकार जोड़ें:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Strict-Transport-Security" value="max-age=31536000"/>
</customHeaders>
</httpProtocol>
</system.webServer>
जाहिर है, आपके पास पहले से ही system.webServer
आपके Web.config में एक ब्लॉक हो सकता है , इसलिए इसे इसमें जोड़ें, यदि ऐसा है। हम GUI के बजाय Web.config में चीजों को संभालना पसंद करते हैं, क्योंकि इसका अर्थ है कि परिवर्तन परिवर्तन हमारे गिट रिपॉजिटरी के लिए प्रतिबद्ध हो सकते हैं।
यदि आप HTTP- से- SSL पुनर्निर्देशन को संभालना चाहते हैं, जैसा कि ग्रेग आस्क ने उल्लेख किया है, तो आपको IIS में एक अलग वेबसाइट के साथ ऐसा करना आसान हो सकता है। यह है कि हम कुछ क्लाइंट साइटों के लिए SSL की आवश्यकता को कैसे संभालते हैं। उस साइट में केवल एक HTTP पुनर्निर्देशित है और कुछ जानकारी-प्रकटीकरण सुधार, सभी Web.config में हैं:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<httpRuntime requestValidationMode="2.0" enableVersionHeader="false" />
</system.web>
<system.webServer>
<httpRedirect enabled="true" destination="https://www.domain.co.uk/"
httpResponseStatus="Permanent" />
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
</customHeaders>
</httpProtocol>
<rewrite>
<outboundRules>
<rule name="Remove RESPONSE_Server">
<match serverVariable="RESPONSE_Server" pattern=".+" />
<action type="Rewrite" value="" />
</rule>
</outboundRules>
</rewrite>
</system.webServer>
</configuration>
यह कुछ कारणों से हमारा पसंदीदा समाधान है - हम आसानी से पुनर्निर्देशित ट्रैफ़िक को अलग से लॉग कर सकते हैं (जैसा कि यह एक अलग IIS लॉग में है), यह Global.asax.cs में अधिक कोड शामिल नहीं करता है (हमारे पास कोई कोड नहीं है वहाँ, जो एक Umbraco साइट के लिए थोड़ा अधिक सुविधाजनक है) और, महत्वपूर्ण बात यह है कि इसका मतलब है कि सभी कॉन्फ़िगरेशन अभी भी हमारे GIT रेपो में हैं।
जोड़ने के लिए संपादित: स्पष्ट करने के लिए , RFC 6797 के अनुपालन के लिए , Strict-Transport-Security
कस्टम हेडर जरूरी नहीं है जो कि अनएन्क्रिप्टेड HTTP द्वारा किए गए अनुरोधों में जोड़ा जाए। RFC6797 के अनुरूप होने के लिए, आपके पास IIS में दो साइटें होनी चाहिए, जैसा कि मैंने पहले कोड ब्लॉक के बाद वर्णित किया है। जैसा कि क्रिस बताते हैं, RFC 6797 में शामिल हैं:
गैर-सुरक्षित परिवहन पर संप्रेषित HTTP प्रतिक्रियाओं में एक HSTS होस्ट जरूरी STS हेडर फ़ील्ड को शामिल नहीं करता है।
इसलिए Strict-Transport-Security
ग्राहक के हेडर को गैर-एसएसएल अनुरोध के जवाब में भेजने से विनिर्देश का पालन नहीं होगा।
मैं आपके द्वारा संदर्भित विकिपीडिया लिंक से उदाहरण का उपयोग करूंगा और साइट के लिए Global.asax में गतिविधि करूंगा। यह किसी https url के अनुरोध को पुनर्निर्देशित करने में सक्षम बनाता है, और फिर प्रतिक्रिया में शीर्ष लेख सम्मिलित करता है।
यह HSTS हेडर को अनदेखा करने के कारण होना चाहिए, अगर यह https प्रतिक्रिया में नहीं है।
protected void Application_BeginRequest()
{
switch (Request.Url.Scheme)
{
case "https":
Response.AddHeader("Strict-Transport-Security", "max-age=31536000");
break;
case "http":
var path = "https://" + Request.Url.Host + Request.Url.PathAndQuery;
Response.Status = "301 Moved Permanently";
Response.AddHeader("Location", path);
break;
}
}
यह ऐसा करने का एक बहुत ही सुरक्षित तरीका है। इस कोड को Global.asax में जोड़ें - Application_BeginRequest इवेंट की आग पहले Asp.net अनुरोध जीवनचक्र में: http://msdn.microsoft.com/en-us/library/system.web.httpappation.beginrequest(v=vs। 110) .aspx
कल्पना के अनुसार, http अनुरोधों को हेडर के साथ जवाब नहीं देना चाहिए - इसलिए यह कोड केवल इसे https अनुरोधों के लिए जोड़ता है। अधिकतम-आयु सेकंड की संख्या में है, और आमतौर पर एक बड़ा मूल्य यहां रखने के लिए एक अच्छा विचार है (आईई - 31536000 इंगित करता है कि साइट केवल अगले 365 दिनों के लिए एसएसएल चलाएगी)
protected void Application_BeginRequest(Object sender, EventArgs e)
{
switch (Request.Url.Scheme)
{
case "https":
Response.AddHeader("Strict-Transport-Security", "max-age=31536000");
break;
case "http":
var path = "https://" + Request.Url.Host + Request.Url.PathAndQuery;
Response.Status = "301 Moved Permanently";
Response.AddHeader("Location", path);
break;
}
}
डग विल्सन द्वारा प्रदान किए गए उदाहरण का उपयोग करके मैंने HTTPS में पुनर्निर्देशन के लिए और HSTS शीर्ष लेख जोड़ने के लिए निम्नलिखित दो पॉवरशेल फ़ंक्शन बनाए हैं।
इनका परीक्षण विंडोज 2012 और विंडोज 2012 आर 2 पर किया गया है।
आपको बस वेबसाइट नाम की आपूर्ति करनी है। यदि आप चूक को पसंद नहीं करते हैं, तो आप वैकल्पिक रूप से नियमों को एक अलग नाम दे सकते हैं।
ध्यान देने वाली एक बात यह है कि मेरे परीक्षण से, सर्वर चर को प्रतिक्रिया शीर्षकों में होने से पहले अनुमति सूची में जोड़ा जाना चाहिए। फ़ंक्शन आपके लिए ऐसा करते हैं।
EDIT: HTTP हेडर के लिए Url Rewrite का संदर्भ यहां देखें: http://www.iis.net/learn/extensions/url-rewrite-module/setting-http-request-headers-and-iis-server-variables
Function Add-HTTPSRedirectRewriteRule()
{
<#
.SYNOPSIS
This function is used to create a URL Rewrite Rule that redirects HTTP requests to HTTPS using a 301
RuleName is optional and will default to "Redirect to HTTPS"
.SYNTAX
Add-HTTPSRedirectRewriteRule -WebsiteName "www.mywebsite.com"
.EXAMPLES
Add-HTTPSRedirectRewriteRule -WebsiteName "www.mywebsite.com"
Add-HTTPSRedirectRewriteRule -WebsiteName "www.mywebsite.com" -RuleName "my rule name"
#>
[cmdletbinding(positionalbinding=$false)]
Param
(
[parameter(mandatory=$true)][String] [ValidateNotNullOrEmpty()] $WebsiteName,
[parameter(mandatory=$false)][String] $RuleName="Redirect to HTTPS"
)
Write-Verbose -Message "Creating the Url Rewrite rule ""$RuleName"" in website ""$WebsiteName"""
Remove-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST" -location "$WebsiteName" -filter "system.webServer/rewrite/rules" -name "." -AtElement @{name="$RuleName"} -ErrorAction SilentlyContinue
Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location "$WebsiteName" -filter "system.webServer/rewrite/rules" -name "." -value @{name="$RuleName";stopProcessing='True'}
Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location "$WebsiteName" -filter "system.webServer/rewrite/rules/rule[@name='$RuleName']/match" -name "url" -value "(.*)"
Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location "$WebsiteName" -filter "system.webServer/rewrite/rules/rule[@name='$RuleName']/conditions" -name "." -value @{input='{HTTPS}';pattern='off'}
Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location "$WebsiteName" -filter "system.webServer/rewrite/rules/rule[@name='$RuleName']/action" -name "type" -value "Redirect"
Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location "$WebsiteName" -filter "system.webServer/rewrite/rules/rule[@name='$RuleName']/action" -name "url" -value "https://{HTTP_HOST}/{R:1}"
}
Function Add-HSTSHeaderRewriteRule()
{
<#
.SYNOPSIS
This function is used to create a URL Rewrite Rule that sets an HTTP Response Header for Strict-Transport-Security
when the protocol requested is HTTPS
RuleName is optional and will default to "Add Strict-Transport-Security header when request is HTTPS"
.SYNTAX
Add-HSTSHeaderRewriteRule -WebsiteName "www.mywebsite.com"
.EXAMPLES
Add-HSTSHeaderRewriteRule -WebsiteName "www.mywebsite.com"
Add-HSTSHeaderRewriteRule -WebsiteName "www.mywebsite.com" -RuleName "my rule name"
#>
[cmdletbinding(positionalbinding=$false)]
Param
(
[parameter(mandatory=$true)][String] [ValidateNotNullOrEmpty()] $WebsiteName,
[parameter(mandatory=$false)][String]$RuleName="Add Strict-Transport-Security header when request is HTTPS"
)
$serverVariable = "RESPONSE_Strict_Transport_Security"
Write-Verbose -Message "Creating the HSTS Header rule ""$RuleName"" in website ""$WebsiteName"""
Remove-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location "$WebsiteName" -filter "system.webServer/rewrite/allowedServerVariables" -name "." -AtElement @{name="$serverVariable"} -ErrorAction SilentlyContinue
Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location "$WebsiteName" -filter "system.webServer/rewrite/allowedServerVariables" -name "." -value @{name="$serverVariable"}
Remove-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST" -location "$WebsiteName" -name "." -filter "system.webServer/rewrite/outboundRules" -AtElement @{name="$RuleName"} -ErrorAction SilentlyContinue
Add-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST" -location "$WebsiteName" -filter "system.webServer/rewrite/outboundRules" -name "." -value @{name="$RuleName"}
Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST" -location "$WebsiteName" -filter "system.webServer/rewrite/outboundRules/rule[@name='$RuleName']/match" -name "serverVariable" -value $serverVariable
Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST" -location "$WebsiteName" -filter "system.webServer/rewrite/outboundRules/rule[@name='$RuleName']/match" -name "pattern" -value ".*"
Add-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST" -location "$WebsiteName" -filter "system.webServer/rewrite/outboundRules/rule[@name='$RuleName']/conditions" -name "." -value @{input='{HTTPS}';pattern='on'}
Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST" -location "$WebsiteName" -filter "system.webServer/rewrite/outboundRules/rule[@name='$RuleName']/action" -name "type" -value "Rewrite"
Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST" -location "$WebsiteName" -filter "system.webServer/rewrite/outboundRules/rule[@name='$RuleName']/action" -name "value" -value "max-age=31536000"
}
HTTP स्ट्रिक्ट ट्रांसपोर्ट सिक्योरिटी IIS IIS मॉड्यूल के निर्माताओं के अनुसार, केवल कस्टम हेडर जोड़ना मसौदा विनिर्देश (RFC 6797) के अनुरूप नहीं है।
आपको वास्तव में IIS 7 पर HSTS चालू करने के लिए इस IIS मॉड्यूल को स्थापित करने की आवश्यकता होगी ।
अपडेट 26 ओकट 2014 : नीचे दिए गए टिप्पणीकार के लिए धन्यवाद, मैंने मॉड्यूल पृष्ठ को फिर से पढ़ा और विशेष रूप से वह हिस्सा जो कस्टम हेडर जोड़ने पर मॉड्यूल के उपयोग को सही ठहराता है।
गैर-सुरक्षित परिवहन पर संप्रेषित HTTP प्रतिक्रियाओं में एक HSTS होस्ट जरूरी STS हेडर फ़ील्ड को शामिल नहीं करता है।
यदि आप HTTPS में और HTTP में केवल हेडर जोड़ना सुनिश्चित करते हैं, तो आपको इस मॉड्यूल की आवश्यकता नहीं है और आप डॉग विल्सन द्वारा उत्तर का उपयोग कर सकते हैं। ओवेन ब्लैकर के उत्तर का उपयोग न करें क्योंकि इसमें https स्थिति नहीं है।
यह Web.Config में निम्नलिखित ब्लॉक जोड़कर किया जा सकता है:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name ="CustomName" value="MyCustomValue"/>
</customHeaders>
</httpProtocol>
</system.webServer>
हमें IIS पर कॉन्फ़िगर करना होगा जो कस्टम हेडर को प्रतिक्रिया देने की क्षमता रखता है:
बस जोड़ने के लिए, मैं टिप्पणियों में देखता हूं 2 लोग 500 त्रुटियों के बारे में बात करते हैं जब आप ऐसा करते हैं। मेरे पास यह था।
यदि आपको IIS में 500 त्रुटि मिलती है तो यह हो सकता है क्योंकि आपने नियम को शीर्ष स्तर पर, विरासत में दिए गए और साइट स्तर पर दोनों को जोड़ा है।
जैसे
Default Web Site <- here
Some Web Site <- here
IIS / ब्राउज़र आपको आपकी त्रुटि से निपटने की सेटिंग की परवाह किए बिना, आपको कोई भी जानकारी देने के लिए नहीं लगता है