Поделиться через


Параметры 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