Cách tốt nhất để bật HTTP Strict Transport Security trên máy chủ web IIS 7 là gì?
Tôi có thể chỉ qua GUI và thêm tiêu đề phản hồi HTTP thích hợp hay tôi nên sử dụng appcmd và nếu có thì chuyển đổi gì?
Cách tốt nhất để bật HTTP Strict Transport Security trên máy chủ web IIS 7 là gì?
Tôi có thể chỉ qua GUI và thêm tiêu đề phản hồi HTTP thích hợp hay tôi nên sử dụng appcmd và nếu có thì chuyển đổi gì?
Câu trả lời:
IIS có khả năng thêm các tiêu đề tùy chỉnh để trả lời . Đây có vẻ là cách dễ nhất để đi về nó.
Theo tài liệu trên IIS.net, bạn có thể thêm các tiêu đề này thông qua Trình quản lý IIS:
- Trong ngăn Kết nối, đi đến trang web, ứng dụng hoặc thư mục mà bạn muốn đặt tiêu đề HTTP tùy chỉnh.
- Trong ngăn Trang chủ, bấm đúp vào Tiêu đề phản hồi HTTP.
- Trong ngăn Tiêu đề phản hồi HTTP, bấm Thêm ... trong ngăn Hành động.
- Trong hộp thoại Thêm tiêu đề phản hồi HTTP tùy chỉnh, đặt tên và giá trị cho tiêu đề tùy chỉnh của bạn, sau đó bấm OK.
Điều này cho phép chúng tôi xử lý cả chuyển hướng HTTP và thêm tiêu đề Strict-Transport-Security vào các phản hồi HTTPS với một trang IIS duy nhất (phải cài đặt mô-đun Viết lại URL):
<?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" />
để vượt qua trên hstspreload.org
https://somedomain.com/https://somedomain.com/relatedpath
và kết quả là đường dẫn bị loại bỏ.
Để bổ sung câu trả lời của voretaq7 , bạn cũng có thể thực hiện việc này bằng tệp Web.config (NB: Chỉ được sử dụng cho các trang SSL, vì nó sẽ thêm tiêu đề cho cả phản hồi HTTP và HTTPS, trái với thông số RFC 6797, vui lòng xem giải thích bên dưới) - thêm một khối như sau:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Strict-Transport-Security" value="max-age=31536000"/>
</customHeaders>
</httpProtocol>
</system.webServer>
Rõ ràng, bạn có thể đã có một system.webServer
khối trong Web.config, vì vậy hãy thêm khối này vào đó, nếu vậy. Chúng tôi thích xử lý mọi thứ trong Web.config hơn là GUI, vì điều đó có nghĩa là các thay đổi cấu hình có thể được cam kết với kho Git của chúng tôi.
Nếu bạn muốn xử lý chuyển hướng HTTP sang SSL, như Greg Askew đã đề cập, bạn có thể thấy việc đó dễ dàng hơn với một trang web riêng trong IIS. Đây là cách chúng tôi xử lý yêu cầu SSL cho một số trang web của khách hàng. Trang web đó chỉ chứa một chuyển hướng HTTP và một số bản sửa lỗi tiết lộ thông tin , tất cả đều có trong 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>
Đây là giải pháp ưa thích của chúng tôi vì một vài lý do - chúng tôi có thể dễ dàng đăng nhập lưu lượng truy cập được chuyển hướng riêng biệt (vì nó trong một bản ghi IIS khác nhau), nó không liên quan đến nhiều mã hơn trong Global.asax.cs (chúng tôi không có bất kỳ mã nào trong đó, thuận tiện hơn một chút cho trang web Umbraco) và quan trọng là điều đó có nghĩa là tất cả các cấu hình vẫn được giữ trong repo GIT của chúng tôi.
Đã chỉnh sửa để thêm: Để rõ ràng, để tuân thủ RFC 6797 , Strict-Transport-Security
tiêu đề tùy chỉnh KHÔNG PHẢI được thêm vào các yêu cầu được tạo bởi HTTP không được mã hóa. Để tuân thủ RFC6797, bạn PHẢI có hai trang web trong IIS, như tôi đã mô tả sau khối mã đầu tiên. Như Chris chỉ ra, RFC 6797 bao gồm:
Máy chủ HSTS KHÔNG PHẢI bao gồm trường tiêu đề STS trong các phản hồi HTTP được truyền tải qua vận chuyển không an toàn.
do đó, việc gửi Strict-Transport-Security
tiêu đề của khách hàng để đáp ứng yêu cầu không có SSL sẽ không tuân thủ thông số kỹ thuật.
Tôi sẽ sử dụng ví dụ từ liên kết Wikipedia mà bạn đã tham chiếu và thực hiện hoạt động trong global.asax cho trang web. Điều này cho phép chuyển hướng yêu cầu đến url https, sau đó chèn tiêu đề vào phản hồi.
Điều này là do tiêu đề HSTS phải được bỏ qua nếu nó không có trong phản hồi 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;
}
}
Đây có vẻ là một cách khá thất bại an toàn để làm điều này. Thêm mã này vào Global.asax - sự kiện Application_BeginRequest kích hoạt đầu tiên trong vòng đời yêu cầu Asp.net: http://msdn.microsoft.com/en-us/l Library / system.web.httpapplication.beginrequest (v = vs. 110) .aspx
Theo thông số kỹ thuật, các yêu cầu http không được phản hồi với tiêu đề - vì vậy mã này chỉ thêm nó cho các yêu cầu https. Tuổi tối đa tính bằng số giây và thường nên đặt giá trị lớn ở đây (IE - 31536000 cho biết trang web sẽ chỉ chạy SSL trong 365 ngày tiếp theo)
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;
}
}
Sử dụng ví dụ do Doug Wilson cung cấp, tôi đã tạo hai hàm PowerShell sau để thêm quy tắc viết lại url để chuyển hướng sang HTTPS và để thêm các tiêu đề HSTS.
Chúng đã được thử nghiệm trên Windows 2012 và Windows 2012 R2.
Tất cả bạn cần làm là cung cấp tên trang web. Bạn có thể tùy ý đặt cho các quy tắc một tên khác nếu bạn không thích mặc định.
Một điều cần lưu ý là từ thử nghiệm của tôi, Biến máy chủ cần được thêm vào danh sách cho phép trước khi nằm trong tiêu đề phản hồi. Các chức năng làm điều này cho bạn.
EDIT: Xem tài liệu tham khảo về Url Rewrite cho HTTP Headers tại đây: 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"
}
Theo các nhà sản xuất Mô-đun IIS Bảo mật Giao thông Vận tải Nghiêm, chỉ cần thêm tiêu đề tùy chỉnh là không tuân thủ thông số kỹ thuật dự thảo (RFC 6797).
Bạn thực sự sẽ cần phải cài đặt Mô-đun IIS này để bật HSTS trên IIS 7.
Cập nhật 26 okt 2014 : Nhờ người bình luận bên dưới, tôi đọc lại trang mô-đun và cụ thể là phần chứng minh việc sử dụng mô-đun qua việc thêm các tiêu đề tùy chỉnh.
Máy chủ HSTS KHÔNG PHẢI bao gồm trường tiêu đề STS trong các phản hồi HTTP được truyền tải qua vận chuyển không an toàn.
Nếu bạn chắc chắn chỉ thêm các tiêu đề trong HTTPS và KHÔNG trong HTTP, bạn không cần mô-đun này và bạn có thể sử dụng câu trả lời của Doug Wilson. Không sử dụng câu trả lời của Owen Blacker vì nó không có điều kiện https.
Điều này có thể được thực hiện bằng cách thêm khối sau vào Web.Config:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name ="CustomName" value="MyCustomValue"/>
</customHeaders>
</httpProtocol>
</system.webServer>
Chúng tôi phải định cấu hình trên IIS có khả năng tùy chỉnh các tiêu đề để phản hồi:
Chỉ cần thêm, tôi thấy trong các ý kiến 2 người nói về 500 lỗi khi bạn làm điều này. Tôi đã có điều này.
Nếu bạn gặp lỗi 500 trong IIS thì có thể là do bạn đã thêm quy tắc ở cấp cao nhất, được đặt thành kế thừa và ở cấp trang web.
ví dụ
Default Web Site <- here
Some Web Site <- here
IIS / Trình duyệt dường như không cung cấp cho bạn bất kỳ thông tin nào bạn đã thực hiện việc này, bất kể cài đặt xử lý lỗi của bạn là gì