1

我正在尝试在我的网站(例如 www.example.com)上实现 HSTS,该网站最近已从 http 移至 https,并且位于默认端口。而且我有一个 WCF 服务运行在同一个域但不同的端口(例如 www.example.com:8000)。

我尝试做的是在 Web.config 文件中添加以下代码

<system.webServer>
    <httpProtocol>
        <customHeaders>
            <add name="Strict-Transport-Security" value="max-age=31536000"/>
        </customHeaders>
    </httpProtocol>
</system.webServer>

然后后来我从这里尝试了这段代码(因为上面的实现是不正确的)

<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}/{R:1}"
                    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" />
            </rule>
        </outboundRules>
    </rewrite>
</system.webServer>

我在 www.example.com 的网站运行良好。但是,一旦我访问 www.example.com,响应标头 Strict-Transport-Security 就会被缓存,然后尝试访问 WCF 服务页面重定向到 https 导致“SSL 错误”,因为该服务在 8000 端口上运行。

注意:清除缓存并访问相同的服务页面会显示该页面。

如何停止将端口 8000 上的调用重定向到 https?

4

1 回答 1

2

HSTS 适用于域上的所有HTTP 调用,而不仅仅是端口 80 上的那些。

来自rfc

UA 必须用“https”[RFC2818] 替换 URI 方案,并且

如果 URI 包含显式端口组件“80”,则 UA 必须将端口组件转换为“443”,或者

如果 URI 包含不等于“80”的显式端口组件,则必须保留端口组件值;否则,

如果 URI 不包含显式端口组件,则 UA 不得添加一个。

注意:这些步骤确保 HSTS 策略适用于通过 HSTS 主机的任何 TCP 端口的 HTTP。

因此,您需要执行以下操作之一:

  1. 也将您的 WCF 服务切换到 https。
  2. 切换 WCF 服务的域,使其不受 HSTS 策略的影响。
  3. 停止使用 HSTS。
于 2015-11-23T21:49:06.847 回答