前言

SSL/TLS 安全评级(中文): https://myssl.com/

HSTS 简介

HSTS的作用是强制客户端(如浏览器)使用HTTPS与服务器创建连接。服务器开启HSTS的方法是,当客户端通过HTTPS发出请求时,在服务器返回的超文本传输协议(HTTP)响应头中包含Strict-Transport-Security字段。非加密传输时设置的HSTS字段无效。

比如,https://example.com/ 的响应头含有Strict-Transport-Security: max-age=31536000; includeSubDomains。这意味着两点:

  1. 在接下来的31536000秒(即一年)中,浏览器向example.com或其子域名发送HTTP请求时,必须采用HTTPS来发起连接。比如,用户点击超链接或在地址栏输入http://www.example.com/ ,浏览器应当自动将 http 转写成 https,然后直接向https://www.example.com/ 发送请求。
  2. 在接下来的一年中,如果 example.com服务器发送的TLS证书无效,用户不能忽略浏览器警告继续访问网站。

来源:百度百科

Nginx 配置

Nginx 服务器中的配置最为简单,只需要编辑 Nginx 配置文件(如:/usr/local/nginx/conf/nginx.conf)将下面行添加到你的 HTTPS 配置的 server 块中即可:

add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

网上看有些人直接添加在 server 块中无效的情况,或许可以试试直接插入到 location ~ *php 内:

location ~ [^/]\.php(/|$) {
    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
}

配置保存后重启 Nginx 服务。

宝塔 Nginx 配置
宝塔 Nginx 配置

Apache 配置

编辑你的 apache 配置文件(如 /etc/apache2/sites-enabled/website.conf 和 /etc/apache2/httpd.conf ),并加以下行到你的 HTTPS VirtualHost:

# Apache 需加载 mod_header 库,一般位于 httpd.conf 文件,搜索 mod_headers 并取消注释。(已加载可跳过)
LoadModule headers_module modules/mod_headers.so

#然后对应站点 VirtualHost 里面插入HSTS响应头信息

Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"

宝塔 Apache 配置 此图来源于网络
宝塔 Apache 配置 此图来源于网络

IIS 配置

我们要开启 IIS 的 HSTS 功能(以 IIS7 + 为例)。打开网站目录下的 web.config 这个文件,在相应的位置添加上针对 https 响应的 url 重写规则(下面配置文件的27~36行),并保存。
max-age 我们这里设置为 365 天。
XML

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <defaultDocument>
            <files>
                <add value="index.php" />
            </files>
        </defaultDocument>
        <staticContent>
            <remove fileExtension=".htm" />
            <remove fileExtension=".html" />
            <mimeMap fileExtension=".html" mimeType="text/html;charset=utf-8" />
            <mimeMap fileExtension=".htm" mimeType="text/html;charset=utf-8" />
            <mimeMap fileExtension=".mp4" mimeType="application/octet-stream" />
        </staticContent>
        <rewrite>
            <rules>
                <rule name="redirect to HTTPS" enabled="true" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions>
                        <add input="{HTTPS}" pattern="^OFF$" />
                    </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>
    <location path="favicon.ico">
        <system.webServer>
            <staticContent>
                <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="31.00:00:00" />
            </staticContent>
        </system.webServer>
    </location>
</configuration>

Lighttpd 配置

对于 lighttpd 来说貌似也很简单,但我没有亲自测试过,将下述配置增加到你的 Lighttpd 配置文件(例如:/etc/lighttpd/lighttpd.conf):

server.modules += ( "mod_setenv" )
$HTTP["scheme"] == "https" {
    setenv.add-response-header  = ( "Strict-Transport-Security" => "max-age=63072000; includeSubdomains; preload")
}

其他配置方法

如果你改不了或者懒得改配置文件,可以采用下面的懒人方法。

将下面的代码插入到 index.php 中:

header("Strict-Transport-Security: max-age=63072000; includeSubdomains; preload");

编辑保存后记得重启一下。

测试

访问 https://myssl.com/ ,输入你的域名进行检测,当没有出现下图绿框内所示的提示,就表明配置成功了。

Last modification:March 29th, 2020 at 05:48 pm
If you think my article is useful to you, please feel free to appreciate