Параметры HSTS для hsts веб-сайта <>
Общие сведения
Элемент <hsts>
<site>
элемента содержит атрибуты, позволяющие настраивать параметры HTTP Strict Transport Security (HSTS) для сайта в IIS 10.0 версии 1709 и более поздних.
Примечание
<hsts>
Если элемент настроен как в разделе, так <siteDefaults>
и в <site>
разделе для определенного сайта, конфигурация в <site>
разделе используется для этого сайта.
Совместимость
Версия | Примечания |
---|---|
IIS 10.0 версии 1709 | Элемент <hsts> элемента появился <site> в IIS 10.0 версии 1709. |
IIS 10.0 | Н/Д |
IIS 8,5 | Н/Д |
IIS 8,0 | Н/Д |
IIS 7,5 | Н/Д |
IIS 7.0 | Н/Д |
IIS 6,0 | Н/Д |
Настройка
Элемент <hsts>
<site>
элемента включен в установку iis 10.0 версии 1709 и более поздних версий по умолчанию.
Инструкции
Отсутствует пользовательский интерфейс, позволяющий настроить <hsts>
элемент <site>
элемента для IIS 10.0 версии 1709. Примеры настройки <hsts>
элемента <site>
элемента программным способом см. в разделе Пример кода этого документа.
Конфигурация
Атрибуты
Атрибут | Описание |
---|---|
enabled |
Дополнительный логический атрибут. Указывает, включена ли служба HSTS (true) или отключена (false) для сайта. Если служба HSTS включена, заголовок HTTP-ответа Strict-Transport-Security добавляется, когда IIS отвечает на HTTPS-запрос на веб-сайт. Значение по умолчанию — false . |
max-age |
Необязательный атрибут uint. Указывает директиву max-age в значении заголовка http-ответа Strict-Transport-Security . Значение по умолчанию — 0 . |
includeSubDomains |
Дополнительный логический атрибут. Указывает, включена ли директива includeSubDomains в значение поля заголовка ответа HTTP Strict-Transport-Security . Примечание: Включите этот атрибут только в том случае, если все поддомены действительно предлагают службу на основе HTTP по протоколу TLS/SSL. Значение по умолчанию — false . |
preload |
Дополнительный логический атрибут. Указывает, включена ли директива предварительной загрузки в значение поля заголовка http-ответа Strict-Transport-Security . Примечание: Включите этот атрибут, только если домен сайта был отправлен для включения в список предварительной загрузки HSTS. Значение по умолчанию — false . |
redirectHttpToHttps |
Дополнительный логический атрибут. Указывает, включено ли перенаправление HTTP на HTTPS (true) или отключено (false) для сайта. Примечание: Включение перенаправленияHttpToHttps обеспечивает перенаправление http на https на уровне сайта. Когда IIS перенаправляет HTTP-запрос, он заменяет схему URI на "https" и игнорирует компонент порта. Убедитесь, что назначение перенаправления предоставляет службу на основе HTTP по протоколу TLS/SSL через стандартный порт 443. Значение по умолчанию — false . |
Дочерние элементы
Отсутствует.
Образец конфигурации
В следующем примере конфигурации показан веб-сайт Contoso с включенным протоколом HSTS с привязками HTTP и HTTPS. Атрибут max-age имеет значение 31536000 секунд (год), чтобы агенты пользователя считали узел известным узлом HSTS в течение года после получения поля заголовка Strict-Transport-Security . Атрибут includeSubDomains имеет значение true , чтобы указать, что политика HSTS применяется к этому узлу HSTS (contoso.com), а также к любому поддомену (например, www.contoso.com
или marketing.contoso.com
). Наконец, атрибут redirectHttpToHttps имеет значение true , чтобы все HTTP-запросы к сайту перенаправлялись на HTTPS.
<site name="Contoso" id="1">
<application path="/" applicationPool="Contoso">
<virtualDirectory path="/" physicalPath="C:\Contoso\Content" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:80:contoso.com" />
<binding protocol="https" bindingInformation="*:443:contoso.com" sslFlags="0" />
</bindings>
<hsts enabled="true" max-age="31536000" includeSubDomains="true" redirectHttpToHttps="true" />
</site>
Пример кода
Следующие примеры кода позволяют использовать HSTS для веб-сайта Contoso с привязками HTTP и HTTPS. Пример задает атрибут max-age как 31536000 секунд (год) и включает атрибуты includeSubDomains и redirectHttpToHttps .
AppCmd.exe
appcmd.exe set config -section:system.applicationHost/sites "/[name='Contoso'].hsts.enabled:True" /commit:apphost
appcmd.exe set config -section:system.applicationHost/sites "/[name='Contoso'].hsts.max-age:31536000" /commit:apphost
appcmd.exe set config -section:system.applicationHost/sites "/[name='Contoso'].hsts.includeSubDomains:True" /commit:apphost
appcmd.exe set config -section:system.applicationHost/sites "/[name='Contoso'].hsts.redirectHttpToHttps:True" /commit:apphost
Примечание
При использовании AppCmd.exe для настройки этих параметров для параметра apphost
фиксации необходимо задать значение . Это зафиксирует параметры конфигурации в соответствующем разделе расположения в файле applicationHost.config.
C#
using System;
using System.Text;
using Microsoft.Web.Administration;
internal static class Sample
{
private static void Main()
{
using(ServerManager serverManager = new ServerManager())
{
Configuration config = serverManager.GetApplicationHostConfiguration();
ConfigurationSection sitesSection = config.GetSection("system.applicationHost/sites");
ConfigurationElementCollection sitesCollection = sitesSection.GetCollection();
ConfigurationElement siteElement = FindElement(sitesCollection, "site", "name", @"Contoso");
if (siteElement == null) throw new InvalidOperationException("Element not found!");
ConfigurationElement hstsElement = siteElement.GetChildElement("hsts");
hstsElement["enabled"] = true;
hstsElement["max-age"] = 31536000;
hstsElement["includeSubDomains"] = true;
hstsElement["redirectHttpToHttps"] = true;
serverManager.CommitChanges();
}
}
private static ConfigurationElement FindElement(ConfigurationElementCollection collection, string elementTagName, params string[] keyValues)
{
foreach (ConfigurationElement element in collection)
{
if (String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase))
{
bool matches = true;
for (int i = 0; i < keyValues.Length; i += 2)
{
object o = element.GetAttributeValue(keyValues[i]);
string value = null;
if (o != null)
{
value = o.ToString();
}
if (!String.Equals(value, keyValues[i + 1], StringComparison.OrdinalIgnoreCase))
{
matches = false;
break;
}
}
if (matches)
{
return element;
}
}
}
return null;
}
}
VB.NET
Imports System
Imports System.Text
Imports Microsoft.Web.Administration
Module Sample
Sub Main()
Dim serverManager As ServerManager = New ServerManager
Dim config As Configuration = serverManager.GetApplicationHostConfiguration
Dim sitesSection As ConfigurationSection = config.GetSection("system.applicationHost/sites")
Dim sitesCollection As ConfigurationElementCollection = sitesSection.GetCollection
Dim siteElement As ConfigurationElement = FindElement(sitesCollection, "site", "name", "Contoso")
If (siteElement Is Nothing) Then
Throw New InvalidOperationException("Element not found!")
End If
Dim hstsElement As ConfigurationElement = siteElement.GetChildElement("hsts")
hstsElement("enabled") = True
hstsElement("max-age") = 31536000
hstsElement("includeSubDomains") = True
hstsElement("redirectHttpToHttps") = True
serverManager.CommitChanges()
End Sub
Private Function FindElement(ByVal collection As ConfigurationElementCollection, ByVal elementTagName As String, ByVal ParamArray keyValues() As String) As ConfigurationElement
For Each element As ConfigurationElement In collection
If String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase) Then
Dim matches As Boolean = True
Dim i As Integer
For i = 0 To keyValues.Length - 1 Step 2
Dim o As Object = element.GetAttributeValue(keyValues(i))
Dim value As String = Nothing
If (Not (o) Is Nothing) Then
value = o.ToString
End If
If Not String.Equals(value, keyValues((i + 1)), StringComparison.OrdinalIgnoreCase) Then
matches = False
Exit For
End If
Next
If matches Then
Return element
End If
End If
Next
Return Nothing
End Function
End Module
JavaScript
var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST";
var sitesSection = adminManager.GetAdminSection("system.applicationHost/sites", "MACHINE/WEBROOT/APPHOST");
var sitesCollection = sitesSection.Collection;
var siteElementPos = FindElement(sitesCollection, "site", ["name", "Contoso"]);
if (siteElementPos == -1) throw "Element not found!";
var siteElement = sitesCollection.Item(siteElementPos);
var hstsElement = siteElement.ChildElements.Item("hsts");
hstsElement.Properties.Item("enabled").Value = true;
hstsElement.Properties.Item("max-age").Value = 31536000;
hstsElement.Properties.Item("includeSubDomains").Value = true;
hstsElement.Properties.Item("redirectHttpToHttps").Value = true;
adminManager.CommitChanges();
function FindElement(collection, elementTagName, valuesToMatch)
{
for (var i = 0; i < collection.Count; i++)
{
var element = collection.Item(i);
if (element.Name == elementTagName)
{
var matches = true;
for (var iVal = 0; iVal < valuesToMatch.length; iVal += 2)
{
var property = element.GetPropertyByName(valuesToMatch[iVal]);
var value = property.Value;
if (value != null)
{
value = value.toString();
}
if (value != valuesToMatch[iVal + 1])
{
matches = false;
break;
}
}
if (matches)
{
return i;
}
}
}
return -1;
}
VBScript
Set adminManager = WScript.CreateObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST"
Set sitesSection = adminManager.GetAdminSection("system.applicationHost/sites", "MACHINE/WEBROOT/APPHOST")
Set sitesCollection = sitesSection.Collection
siteElementPos = FindElement(sitesCollection, "site", Array("name", "Contoso"))
If siteElementPos = -1 Then
WScript.Echo "Element not found!"
WScript.Quit
End If
Set siteElement = sitesCollection.Item(siteElementPos)
Set hstsElement = siteElement.ChildElements.Item("hsts")
hstsElement.Properties.Item("enabled").Value = True
hstsElement.Properties.Item("max-age").Value = 31536000
hstsElement.Properties.Item("includeSubDomains").Value = True
hstsElement.Properties.Item("redirectHttpToHttps").Value = True
adminManager.CommitChanges()
Function FindElement(collection, elementTagName, valuesToMatch)
For i = 0 To CInt(collection.Count) - 1
Set element = collection.Item(i)
If element.Name = elementTagName Then
matches = True
For iVal = 0 To UBound(valuesToMatch) Step 2
Set property = element.GetPropertyByName(valuesToMatch(iVal))
value = property.Value
If Not IsNull(value) Then
value = CStr(value)
End If
If Not value = CStr(valuesToMatch(iVal + 1)) Then
matches = False
Exit For
End If
Next
If matches Then
Exit For
End If
End If
Next
If matches Then
FindElement = i
Else
FindElement = -1
End If
End Function
Командлеты PowerShell iisAdministration
Import-Module IISAdministration
Reset-IISServerManager -Confirm:$false
Start-IISCommitDelay
$sitesCollection = Get-IISConfigSection -SectionPath "system.applicationHost/sites" | Get-IISConfigCollection
$siteElement = Get-IISConfigCollectionElement -ConfigCollection $sitesCollection -ConfigAttribute @{"name"="Contoso"}
$hstsElement = Get-IISConfigElement -ConfigElement $siteElement -ChildElementName "hsts"
Set-IISConfigAttributeValue -ConfigElement $hstsElement -AttributeName "enabled" -AttributeValue $true
Set-IISConfigAttributeValue -ConfigElement $hstsElement -AttributeName "max-age" -AttributeValue 31536000
Set-IISConfigAttributeValue -ConfigElement $hstsElement -AttributeName "includeSubDomains" -AttributeValue $true
Set-IISConfigAttributeValue -ConfigElement $hstsElement -AttributeName "redirectHttpToHttps" -AttributeValue $true
Stop-IISCommitDelay
Remove-Module IISAdministration
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по