在服务器上启用 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 的广告主至少做出选择。您可能需要推迟完成使站内网址变成相对网址,直到有足够多的广告客户能够正常互操作为止。