本页面提供了有关在服务器上设置 HTTPS 的指导,包括以下步骤:
- 创建一个 2048 位 RSA 公钥/私钥对。
- 生成嵌入公钥的证书签名请求 (CSR)。
- 与证书授权机构 (CA) 共享 CSR,以接收最终证书或证书链。
- 将最终证书安装在无法通过 Web 访问的位置,例如
/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
)。
将证书复制到所有前端服务器上不可通过 Web 访问的位置,例如 /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+ 的评分。请将导致评分较低的任何问题视为 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>
请使用脚本(而非手动)更新您的链接,以免出错。如果您网站的内容位于数据库中,请在数据库的开发副本上测试脚本。如果您网站的内容仅包含简单的文件,请在文件的开发副本上测试脚本。请仅在更改通过质量检查后,按照常规方式将更改推送到生产环境。您可以使用 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 设置 Secure 标志。
首先,使用严格传输安全协议告知客户端,他们应始终使用 HTTPS 连接到您的服务器,即使遵循 http://
引用也是如此。这可以防范 SSL 剥离等攻击,并避免我们在将 HTTP 重定向到 HTTPS 中启用的 301 redirect
的往返开销。
如需开启 HSTS,请设置 Strict-Transport-Security
标头。OWASP 的 HSTS 页面提供了指向各种服务器软件说明的链接。
大多数网络服务器都提供类似的自定义标头添加功能。
此外,请务必确保客户端绝不会通过 HTTP 发送 Cookie(例如用于身份验证或网站偏好设置的 Cookie)。例如,如果用户的身份验证 Cookie 以纯文本形式泄露,那么您对其整个会话的安全保证将会失效,即使您已正确执行所有其他操作也是如此!
为避免出现这种情况,请将您的 Web 应用更改为始终在其设置的 Cookie 上设置安全标志。此 OWASP 页面介绍了如何在多个应用框架中设置 Secure 标志。每个应用框架都有自己的标志设置方式。
大多数网络服务器都提供简单的重定向功能。使用 301 (Moved Permanently)
向搜索引擎和浏览器表明 HTTPS 版本是规范网页,并将用户从 HTTP 重定向到网站的 HTTPS 版本。
搜索结果排名
Google 会将 HTTPS 用作积极的搜索质量指标。Google 还发布了一份指南,介绍了如何转移、迁移或迁徙网站,同时保持其搜索排名。Bing 还发布了面向网站站长的指南。
性能
当内容和应用层经过良好调整(请参阅 Steve Souders 的图书获取建议)后,与应用的总体开销相比,剩余的 TLS 性能问题通常不大。您还可以降低这些费用并进行摊销。如需有关 TLS 优化的建议,请参阅 Ilya Grigorik 的 High Performance Browser Networking,以及 Ivan Ristic 的 OpenSSL Cookbook 和 Bulletproof SSL And TLS。
在某些情况下,TLS 可以提升性能,这主要是因为它支持 HTTP/2。如需了解详情,请参阅 Chris Palmer 在 2014 年 Chrome 开发者峰会上关于 HTTPS 和 HTTP/2 性能的演讲。
Referer 标头
当用户点击指向您 HTTPS 网站上的其他 HTTP 网站的链接时,用户代理不会发送“Referer”标头。如果出现此问题,您可以通过以下几种方法解决:
- 其他网站应迁移到 HTTPS。如果推荐网站完成了本指南的在服务器上启用 HTTPS部分,您可以将您网站中的链接从
http://
更改为https://
,或使用相对于协议的链接。 - 如需解决与引荐来源网址标头相关的各种问题,请使用新的引荐来源网址政策标准。
广告收入
通过展示广告创收的网站运营者希望确保迁移到 HTTPS 不会减少广告展示次数。不过,由于混合内容安全问题,HTTP <iframe>
不适用于 HTTPS 网页。在广告客户通过 HTTPS 发布广告之前,网站运营商无法在不损失广告收入的情况下迁移到 HTTPS;但在网站运营商迁移到 HTTPS 之前,广告客户也没有动力发布 HTTPS 广告。
您可以先使用通过 HTTPS 提供广告服务的广告客户,并要求完全不投放 HTTPS 广告的广告客户至少将其作为一种选项,从而开始打破这种僵局。您可能需要推迟完成将站内网址设为相对网址,直到有足够多的广告客户能够正常互动。