此页面提供有关在您的服务器上设置 HTTPS 的指南,包括以下步骤
- 创建 2048 位 RSA 公钥/私钥对。
- 生成嵌入您的公钥的证书签名请求 (CSR)。
- 与您的证书颁发机构 (CA) 共享您的 CSR,以接收最终证书或证书链。
- 将您的最终证书安装在 Web 无法访问的位置,例如
/etc/ssl
(Linux 和 Unix)或 IIS 要求的位置 (Windows)。
生成密钥和证书签名请求
本节使用 openssl 命令行程序(大多数 Linux、BSD 和 Mac OS X 系统都附带该程序)来生成私钥和公钥以及 CSR。
生成公钥/私钥对
首先,生成一个 2,048 位的 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
。
将证书复制到所有前端服务器的 Web 无法访问的位置,例如 /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+ 的评分。将导致较低等级的任何问题都视为错误,并保持警惕,因为针对算法和协议的新攻击总是在不断开发。
使站内 URL 成为相对 URL
既然您同时在 HTTP 和 HTTPS 上提供您的站点,那么无论使用哪种协议,都需要尽可能顺利地工作。一个重要因素是为站内链接使用相对 URL。
确保站内 URL 和外部 URL 不依赖于特定的协议。使用相对路径或省略协议,如 //example.com/something.js
。
使用 HTTPS 提供包含 HTTP 资源的页面可能会导致问题。当浏览器遇到使用不安全资源的原本安全的页面时,它会警告用户该页面并非完全安全,并且某些浏览器会拒绝加载或执行 HTTP 资源,从而破坏页面。但是,您可以安全地在 HTTP 页面中包含 HTTPS 资源。有关修复这些问题的更多指南,请参阅修复混合内容。
遵循基于 HTTP 的链接到您站点上的其他页面也可能会将用户体验从 HTTPS 降级为 HTTP。为了解决这个问题,请尽可能使您的站内 URL 成为相对 URL,使其成为协议相对 URL(缺少协议,以 //example.com
开头)或主机相对 URL(仅以路径开头,如 /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>
使用脚本更新您的链接,而不是手动更新,以避免犯错。如果您的站点内容在数据库中,请在数据库的开发副本上测试您的脚本。如果您的站点内容仅由简单文件组成,请在文件的开发副本上测试您的脚本。仅在更改通过 QA 后才将更改推送到生产环境,就像正常情况一样。您可以使用 Bram van Damme 的脚本或类似工具来检测您站点中的混合内容。
当链接到其他站点(而不是包含来自其他站点的资源)时,请勿更改协议。您无法控制这些站点的运行方式。
为了使大型站点的迁移更顺畅,我们建议使用协议相对 URL。如果您不确定是否可以完全部署 HTTPS,则强制您的站点对所有子资源使用 HTTPS 可能会适得其反。在一段时间内,HTTPS 可能对您来说是新的且奇怪的,而 HTTP 站点必须像以往一样正常工作。随着时间的推移,您将完成迁移并锁定 HTTPS(请参阅接下来的两节)。
如果您的站点依赖于第三方(例如 CDN 或 jquery.com)提供的脚本、图像或其他资源,则您有两个选择
- 对这些资源使用协议相对 URL。如果第三方不提供 HTTPS,请要求他们提供。大多数第三方已经提供 HTTPS,包括 jquery.com。
- 从您控制的服务器提供资源,该服务器同时提供 HTTP 和 HTTPS。无论如何,这通常是一个好主意,因为这样您就可以更好地控制站点的外观、性能和安全性,而不必信任第三方来保证站点的安全。
将 HTTP 重定向到 HTTPS
要告诉搜索引擎使用 HTTPS 访问您的站点,请使用 <link rel="canonical" href="https://…"/>
标记在每个页面的头部放置一个规范链接。
启用严格传输安全和安全 Cookie
此时,您已准备好“锁定” HTTPS 的使用
- 使用 HTTP 严格传输安全 (HSTS) 以避免 301 重定向的开销。
- 始终在 Cookie 上设置 Secure 标志。
首先,使用严格传输安全来告诉客户端他们应始终使用 HTTPS 连接到您的服务器,即使在遵循 http://
引用时也是如此。这可以击败诸如 SSL Stripping 之类的攻击,并避免我们在将 HTTP 重定向到 HTTPS中启用的 301 重定向
的往返开销。
要启用 HSTS,请设置 Strict-Transport-Security
标头。OWASP 的 HSTS 页面提供了针对各种服务器软件的说明链接。
大多数 Web 服务器都提供类似的功能来添加自定义标头。
同样重要的是要确保客户端永远不会通过 HTTP 发送 Cookie(例如用于身份验证或站点首选项)。例如,如果用户的身份验证 Cookie 以纯文本形式公开,那么即使您已正确完成所有其他操作,您对其整个会话的安全保证也会被破坏!
为避免这种情况,请更改您的 Web 应用程序以始终在其设置的 Cookie 上设置 Secure 标志。此 OWASP 页面解释了如何在多个应用程序框架中设置 Secure 标志。每个应用程序框架都有设置该标志的方法。
大多数 Web 服务器都提供简单的重定向功能。使用 301(永久移动)
向搜索引擎和浏览器指示 HTTPS 版本是规范版本,并将您的用户从 HTTP 重定向到您站点的 HTTPS 版本。
搜索排名
Google 使用HTTPS 作为积极的搜索质量指标。Google 还发布了有关如何在保持搜索排名的同时转移、移动或迁移您的站点的指南。Bing 也发布了网站管理员指南。
性能
当内容和应用层得到良好调整时(有关建议,请参阅Steve Souders 的书籍),剩余的 TLS 性能问题通常相对于应用程序的总体成本而言很小。您还可以减少和分摊这些成本。有关 TLS 优化的建议,请参阅 Ilya Grigorik 的高性能浏览器网络,以及 Ivan Ristic 的OpenSSL Cookbook 和 Bulletproof SSL And TLS。
在某些情况下,TLS 可以提高性能,主要是因为 HTTP/2 成为可能。有关更多信息,请参阅 Chris Palmer 在 2014 年 Chrome 开发者峰会上关于 HTTPS 和 HTTP/2 性能的演讲。
引用标头
当用户从您的 HTTPS 站点跟踪链接到其他 HTTP 站点时,用户代理不会发送 Referer 标头。如果这是一个问题,则有几种方法可以解决它
- 其他站点应迁移到 HTTPS。如果被引用站点完成了本指南的在您的服务器上启用 HTTPS部分,您可以将您站点中到他们的链接从
http://
更改为https://
或使用协议相对链接。 - 为了解决 Referer 标头的各种问题,请使用新的引用策略标准。
广告收入
通过展示广告将其网站货币化的网站运营商希望确保迁移到 HTTPS 不会减少广告展示次数。但是,由于混合内容安全问题,HTTP <iframe>
在 HTTPS 页面上不起作用。在广告商通过 HTTPS 发布广告之前,网站运营商无法迁移到 HTTPS 而不会损失广告收入;但在网站运营商迁移到 HTTPS 之前,广告商几乎没有动力发布 HTTPS。
您可以开始打破这种僵局的过程,方法是使用通过 HTTPS 提供广告服务的广告商,并要求根本不提供 HTTPS 的广告商至少使其成为一种选择。您可能需要推迟完成使站内 URL 成为相对 URL,直到有足够的广告商正确互操作。