在服务器上启用 HTTPS

Chris Palmer
Chris Palmer
Matt Gaunt

本页面提供了有关在服务器上设置 HTTPS 的指南,包括以下步骤:

  • 创建一个 2048 位 RSA 公钥/私钥对。
  • 生成嵌入您的公钥的证书签名请求 (CSR)。
  • 将 CSR 与证书授权机构 (CA) 共享以接收最终证书或证书链。
  • 将最终证书安装在非网络可访问的位置,例如 /etc/ssl(Linux 和 Unix)或 IIS 需要它的位置 (Windows)。

生成密钥和证书签名请求

此部分使用 openssl 命令行程序(大部分 Linux、BSD 和 Mac OS X 系统均附带此程序)来生成私钥、公钥以及 CSR。

生成公钥/私钥对

首先,请生成一个 2048 位 RSA 密钥对。较短的密钥可能会被暴力猜测攻击破坏,而较长的密钥则会使用不必要的资源。

使用以下命令生成 RSA 密钥对:

openssl genrsa -out www.example.com.key 2048

这将生成以下输出:

Generating RSA private key, 2048 bit long modulus
.+++
.......................................................................................+++
e is 65537 (0x10001)

生成证书签名请求

在此步骤中,您需要将公钥以及有关贵组织及网站的信息嵌入到证书签名请求(即 CSR)中。openssl 命令要求您提供所需的元数据。

运行以下命令:

openssl req -new -sha256 -key www.example.com.key -out www.example.com.csr

输出以下内容:

You are about to be asked to enter information that will be incorporated
into your certificate request

What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CA
State or Province Name (full name) [Some-State]:California
Locality Name (for example, city) []:Mountain View
Organization Name (for example, company) [Internet Widgits Pty Ltd]:Example, Inc.
Organizational Unit Name (for example, section) []:Webmaster Help Center Example
Team
Common Name (e.g. server FQDN or YOUR name) []:www.example.com
Email Address []:webmaster@example.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

为确保 CSR 的有效性,请运行以下命令:

openssl req -text -in www.example.com.csr -noout

响应应如下所示:

Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=CA, ST=California, L=Mountain View, O=Google, Inc.,
OU=Webmaster Help Center Example Team,
CN=www.example.com/emailAddress=webmaster@example.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:ad:fc:58:e0:da:f2:0b:73:51:93:29:a5:d3:9e:
                    f8:f1:14:13:64:cc:e0:bc:be:26:5d:04:e1:58:dc:
                    ...
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha256WithRSAEncryption
         5f:05:f3:71:d5:f7:b7:b6:dc:17:cc:88:03:b8:87:29:f6:87:
         2f:7f:00:49:08:0a:20:41:0b:70:03:04:7d:94:af:69:3d:f4:
         ...

将 CSR 提交给证书授权机构

不同的证书授权机构 (CA) 要求您以不同的方式将 CSR 提交给他们。其中包括使用其网站上的表单或通过电子邮件发送 CSR。某些 CA 或其转销商甚至可能会自动执行部分或全部流程,包括在某些情况下,包括密钥对和 CSR 的生成。

将 CSR 发送到您的 CA 并按照其说明接收最终证书或证书链。

对于为您的公钥进行证实的服务,不同 CA 的收费将有所不同。

您还可以选择将密钥映射到多个 DNS 名称,包括几个不同的名称(例如 example.com、www.example.com、example.net 和 www.example.net 的全部)或“通配符”名称,例如 *.example.com

将证书复制到所有前端服务器的非网络可访问位置,例如 /etc/ssl(Linux 和 Unix)或 IIS (Windows) 需要它们的位置。

在服务器上启用 HTTPS

在服务器上启用 HTTPS 是确保网页安全的关键一步。

  • 使用 Mozilla 的服务器配置工具设置服务器以支持 HTTPS。
  • 定期使用 Qualys 的 SSL 服务器测试来测试您的网站,并确保得分至少为 A 或 A+。

此时,您必须做出关键的操作决策。请选择以下选项之一:

  • 为 Web 服务器从中传送内容的每个主机名指定一个不同的 IP 地址。
  • 使用基于名称的虚拟托管。

如果您一直为每个主机名使用不同的 IP 地址,则可以针对所有客户端同时支持 HTTP 和 HTTPS。不过,大多数网站运营商使用基于名称的虚拟托管方案来节省 IP 地址,而且这样做通常更方便。

如果您的服务器上还没有 HTTPS 服务,请立即启用它(无需将 HTTP 重定向到 HTTPS)。如需了解详情,请参阅将 HTTP 重定向到 HTTPS。将 Web 服务器配置为使用您购买和安装的证书。Mozilla 的配置生成器可能会对您有所帮助。

如果您有许多主机名或子网域,则每个主机名或子网域都需要使用正确的证书。

现在,并且会在网站的整个生命周期内定期使用 Qualys 的 SSL 服务器测试检查您的 HTTPS 配置。您的网站得分应该为 A 或 A+。请将导致等级降低的任何因素视为 bug,并坚持不懈,因为针对算法和协议的新攻击层出不穷。

将站内网址设为相对网址

由于您的网站同时采用 HTTP 和 HTTPS 协议,因此无论采用何种协议,都必须尽可能顺畅运行。一个重要的因素是对站内链接使用相对网址。

确保站内网址和外部网址不依赖于特定协议。 使用相对路径或像在 //example.com/something.js 中省略协议一样。

使用 HTTPS 提供包含 HTTP 资源的网页可能会导致问题。当浏览器遇到使用不安全资源但其他安全网页的情况时,它会警告用户网页并非完全安全,并且有些浏览器会拒绝加载或执行 HTTP 资源,这会导致网页出现问题。不过,您可以在 HTTP 页面中安全地包含 HTTPS 资源。如需有关解决这些问题的更多指导,请参阅修正混合内容

通过跟踪您网站上其他网页的 HTTP 链接也可能会将用户体验从 HTTPS 降级为 HTTP。若要解决此问题,请尽可能使站内网址成为相对协议网址(缺少协议,以 //example.com 开头)或主机相对网址(以路径开头,例如 /jquery.js)。

正确做法
<h1>Welcome To Example.com</h1>
<script src="/jquery.js"></script>
<link rel="stylesheet" href="/assets/style.css"/>
<img src="/images/logo.png"/>;
<p>A <a href="/2014/12/24">new post on cats!</a></p>
使用相对站内网址。
正确做法
<h1>Welcome To Example.com</h1>
<script src="//example.com/jquery.js"></script>
<link rel="stylesheet" href="//assets.example.com/style.css"/>
<img src="//img.example.com/logo.png"/>;
<p>A <a href="//example.com/2014/12/24/">new post on cats!</a></p>
或者使用相对协议的站内网址。
正确做法
<h1>Welcome To Example.com</h1>
<script src="/jquery.js"></script>
<link rel="stylesheet" href="/assets/style.css"/>
<img src="/images/logo.png"/>;
<p>A <a href="/2014/12/24">new post on cats!</a></p>
<p>Check out this <a href="https://foo.com/"><b>other cool site.</b></a></p>
尽可能使用 HTTPS 网址作为指向其他网站的链接。

请通过脚本更新链接,而不要手动更新,以免出错。如果网站内容在数据库中,请在数据库的开发副本中测试脚本。如果网站内容仅包含简单文件,请在文件的开发副本中测试脚本。像往常一样,只有在更改通过 QA 后,才会将更改推送到生产环境。您可以使用 Bram van Damme 的脚本或类似脚本来检测网站中的混合内容。

链接到其他网站(而不是包括其他网站的资源)时,请勿更改协议。您无法控制这些网站的运作方式。

为了让大型网站的迁移更顺畅,我们建议您使用相对协议网址。如果您不确定是否可以完全部署 HTTPS,强制网站所有子资源使用 HTTPS 可能会弄巧成拙。可能会有一段时间,您对 HTTPS 感到新奇怪异,而 HTTP 网站必须仍像往常一样正常运行。随着时间的推移,您将完成迁移并锁定 HTTPS(请参阅以下两个部分)。

如果您的网站依赖于第三方(例如 CDN 或 jquery.com)提供的脚本、图片或其他资源,则有两种选择:

  • 对这些资源使用相对协议网址。如果第三方不提供 HTTPS,请让第三方提供。大多数已经实现,包括 jquery.com。
  • 从您控制的服务器提供资源,该服务器同时提供 HTTP 和 HTTPS。这通常是个好主意,因为您可以更好地控制网站的外观、性能和安全,而且无需信任第三方来保障网站安全。

将 HTTP 重定向到 HTTPS

如需指示搜索引擎使用 HTTPS 访问您的网站,请使用 <link rel="canonical" href="https://…"/> 标记在每个网页的开头放置一个规范链接

启用严格传输安全和安全 Cookie

此时,您可以“锁定”使用 HTTPS:

  • 使用 HTTP 严格传输安全协议 (HSTS) 来避免 301 重定向产生的费用。
  • 始终在 Cookie 上设置安全标记。

首先,使用严格传输安全来告知客户端应始终使用 HTTPS 连接到您的服务器,即使在遵循 http:// 引用时也是如此。这样可以阻止 SSL 剥离等攻击,并避免我们在将 HTTP 重定向到 HTTPS 中启用的 301 redirect 的往返费用。

如需启用 HSTS,请设置 Strict-Transport-Security 标头。OWASP 的 HSTS 页面包含指向各种服务器软件的说明链接

大多数网络服务器都提供类似的功能来添加自定义标头。

此外,请务必确保客户端绝不会通过 HTTP 发送 Cookie(例如,用于身份验证或网站偏好设置)。例如,如果用户的身份验证 Cookie 以明文形式公开,那么即使您其他的措施都正确无误,您对其整个会话的安全保证也会遭到破坏!

为避免出现这种情况,请将您的 Web 应用更改为始终在其设置的 Cookie 上设置安全标志。此 OWASP 页面介绍了如何在多个应用框架中设置安全标志。每个应用框架都有一种方法来设置此标记。

大多数网络服务器都提供一种简单的重定向功能。使用 301 (Moved Permanently) 向搜索引擎和浏览器表明 HTTPS 版本是规范版本,并将用户从 HTTP 重定向到网站的 HTTPS 版本。

搜索结果排名

Google 使用 HTTPS 作为肯定搜索质量指标。Google 还发布了有关如何在保持网站搜索排名的同时转移、迁移或迁移网站的指南。Bing 还发布了网站站长指南

性能

如果内容和应用层已得到很好的建议(请参阅 Steve Souders 的著作),那么相对于应用的总体成本而言,剩余的 TLS 性能问题通常很小。您还可以减少和分摊这些费用。如需有关 TLS 优化的建议,请参阅 Ilya Grigorik 的高性能浏览器网络以及 Ivan Ristic 的 OpenSSL CookbookBulletproof SSL 和 TLS

在某些情况下,TLS 可以提高性能,这主要是因为采用了 HTTP/2。有关详细信息,请参阅 Chris Palmer 在 2014 年 Chrome 开发者峰会上关于 HTTPS 和 HTTP/2 性能的演讲

引荐来源网址标头

当用户从您的 HTTPS 网站链接到其他 HTTP 网站时,用户代理不会发送引荐来源网址标头。如果这是个问题,有多种方法可以解决:

  • 其他网站应迁移到 HTTPS。如果被引荐网站完成了本指南的在服务器上启用 HTTPS 部分,您可以将您网站中指向他们网站的链接从 http:// 更改为 https://,或使用相对协议链接。
  • 若要解决引荐来源网址标头方面的各种问题,请使用新的引荐来源网址政策标准

广告收入

通过展示广告来利用网站创收的网站运营商希望确保迁移到 HTTPS 不会减少广告展示次数。但是,由于混合内容安全问题,HTTP <iframe> 无法在 HTTPS 网页上运行。在广告客户通过 HTTPS 发布内容之前,网站运营商无法在不损失广告收入的情况下迁移到 HTTPS;但在网站运营商迁移到 HTTPS 之前,广告客户发布 HTTPS 的动力就很低。

您可以借助通过 HTTPS 提供广告服务的广告主着手打破这种僵局,并要求完全不提供 HTTPS 的广告主至少做出选择。您可能需要推迟完成使站内网址变成相对网址,直到有足够多的广告客户能够正常互操作为止。