本页面提供了有关在服务器上设置 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>
请通过脚本更新链接,而不要手动更新,以免出错。如果网站内容在数据库中,请在数据库的开发副本中测试脚本。如果网站内容仅包含简单文件,请在文件的开发副本中测试脚本。像往常一样,只有在更改通过 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 Cookbook 和Bulletproof 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 的广告主至少做出选择。您可能需要推迟完成使站内网址变成相对网址,直到有足够多的广告客户能够正常互操作为止。