为网站提供 HTTPS 或安全套接字层 (SSL) 证书,通常由证书颁发机构 (CA) 签署,该证书颁发机构实际上是受信任的第三方,可验证有关您网站的一些基本详细信息,并证明它用于浏览器。如果您的浏览器信任 CA,则它信任由该 CA 签名的任何证书(这称为信任链)。
每个 HTTP(或 HTTPS)请求都由两部分组成:请求和响应。当您通过 HTTPS 请求某些内容时,实际上会在后台发生一些事情:
- 客户端(浏览器)进行“握手”,请求服务器的公钥和标识。
- 此时,浏览器可以检查有效性(站点名称是否匹配?日期范围是当前的吗?它是否由它信任的 CA 签名?)。它甚至可以联系 CA 并确保证书有效。
- 客户端创建一个新的 pre-master secret,使用服务器的公钥加密(因此只有服务器可以解密)并发送给服务器
- 服务器和客户端都使用此预主密钥生成主密钥,然后使用该主密钥创建用于实际数据交换的对称会话密钥
- 双方发送消息说他们已完成握手
- 服务器然后正常处理请求,然后使用会话密钥对响应进行加密
如果连接保持打开状态,则每个连接都将使用相同的对称密钥。
如果建立了新连接,并且双方仍然拥有主密钥,则可以在“简短握手”中生成新的会话密钥。通常,浏览器会存储一个主密钥直到它关闭,而服务器会存储它几分钟或几个小时(取决于配置)。
有关会话长度的更多信息,请参阅How long does an HTTPS symmetric key last?
证书和主机名
证书被分配了一个通用名称 (CN),对于 HTTPS,它是域名。 CN 必须完全匹配,例如,CN 为“example.com”的证书将与域“www.example.com”不匹配,用户将在浏览器中收到警告。
在SNI 之前,无法在一个 IP 上托管多个域名。因为证书是在客户端甚至发送实际的 HTTP 请求之前获取的,并且 HTTP 请求包含 Host: 标头行,告诉服务器使用哪个 URL,服务器无法知道为给定的服务提供什么证书要求。 SNI 将主机名添加到 TLS 握手的一部分,因此只要客户端和服务器都支持它(在 2015 年,它被广泛支持),那么服务器就可以选择正确的证书。
即使没有 SNI,提供多个主机名的一种方法是使用包含主题备用名称 (SAN) 的证书,这些证书本质上是证书有效的附加域。例如,Google 使用一个证书来保护它的许多网站。
另一种方法是使用通配符证书。可以获得像“.example.com”这样的证书,在这种情况下,“www.example.com”和“foo.example.com”都对该证书有效。但是,请注意“example.com”与“.example.com”不匹配,“foo.bar.example.com”也不匹配。如果您使用“www.example.com”作为证书,则应将“example.com”上的任何人重定向到“www”。地点。如果他们请求https://example.com,除非您将其托管在单独的 IP 上并拥有两个证书,否则将收到证书错误。
当然,您可以同时使用通配符和 SAN(只要您的 CA 允许您这样做)并为“example.com”和 SAN“.example.com”、“example .net”和“.example.net”,例如。
表格
严格来说,如果你是提交一个表单,那么表单页面本身是否没有加密也没关系,只要提交的 URL 是一个 https:// 的 URL。实际上,用户已经被训练(至少在理论上)不要提交页面,除非他们看到小“锁定图标”,所以即使是表单本身也应该通过 HTTPS 提供服务来获得这个。
流量和服务器负载
HTTPS 流量比同等的 HTTP 流量大得多(由于加密和证书开销),而且它也给服务器带来了更大的压力(加密和解密)。如果您有一个负载很重的服务器,则可能需要对使用 HTTPS 提供哪些内容非常有选择性。
最佳做法
如果您不只是对整个站点使用 HTTPS,它应该会根据需要自动重定向到 HTTPS。每当用户登录时,他们都应该使用 HTTPS,如果您使用会话 cookie,则 cookie 应该有 secure flag set。这可以防止截获会话 cookie,鉴于开放(未加密)wifi 网络的普及,这一点尤其重要。
-
页面上的任何资源都应该来自页面使用的相同方案。如果您在使用 HTTPS 加载页面时尝试从 http:// 获取图像,用户将收到安全警告。您应该使用完全限定的 URL,或者另一种简单的方法是使用不包含主机名的绝对 URL(例如,src="/images/foo.png"),因为它们适用于两者。
- 这包括外部资源(例如,Google Analytics)
从 HTTPS 更改为 HTTP 时不要执行 POST(表单提交)。大多数浏览器都会将此标记为安全警告。