在服务器上启用 HTTPS

Chris Palmer
Chris Palmer
Matt Gaunt

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

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

生成密钥和证书签名请求

本部分使用大部分 Linux、BSD 和 Mac OS X 系统附带的 openssl 命令行程序生成私钥、公钥和 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+。

此时,您必须做出关键的操作决定。请从下列选项中选择一项:

  • 给为网络服务器提供内容的每个主机名指定一个独立的 IP 地址。
  • 使用基于名称的虚拟托管。

如果您一直针对每个主机名使用独立的 IP 地址,则可以让所有客户端同时支持 HTTP 和 HTTPS。但是,大多数网站运营商使用基于名称的虚拟托管以节约 IP 地址,另一个原因是这样通常更方便。

如果您的服务器上还没有 HTTPS 服务,请立即启用(无需将 HTTP 重定向到 HTTPS。如需了解详情,请参阅将 HTTP 重定向到 HTTPS。配置网络服务器以使用您购买并安装的证书。您可能发现 Mozilla 的配置生成器很有用。

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

现在,以及您网站的整个生命周期中,请定期使用 Qualys 的 SSL 服务器测试检查您的 HTTPS 配置。您的网站得分应为 A 或 A+。将导致降级的任何因素均视为错误,并保持警惕,因为针对算法和协议的新攻击始终在开发中。

使站内网址变为相对网址

由于您的网站同时运行 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 手册》和《SSL 和 TLS 的防弹衣》

在某些情况下,TLS 可以提高性能,主要是可以采用 HTTP/2 所带来的结果。如需了解详情,请参阅 Chris Palmer 在 Chrome 开发者峰会 2014 上关于 HTTPS 和 HTTP/2 性能的演讲

引荐来源标头

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

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

广告收入

通过展示广告来创收的网站运营商希望确保迁移到 HTTPS 不会降低广告曝光量。不过,由于混合内容的安全问题,HTTP <iframe> 在 HTTPS 网页中不起作用。在广告商通过 HTTPS 发布广告之前,网站运营商无法在不损失广告收入的情况下迁移到 HTTPS;但是在网站运营商迁移到 HTTPS 之前,广告商没有动力来通过 HTTPS 发布广告。

您可以先使用通过 HTTPS 提供广告服务的广告客户,并要求完全不提供 HTTPS 的广告客户至少提供此选项,从而开始打破这种僵局。您可能需要推迟完成使站内网址变成相对网址,直到有足够数量的广告客户能正常地互操作。