php - PHP 开发人员需要了解哪些有关 https/安全套接字层连接的知识?

标签 php security ssl https

关于 https 连接的方式和原因,我几乎一无所知。显然,当我传输密码等安全数据或特别是信用卡信息时,https 是一个关键工具。但是,我需要了解什么?你看到开发人员在他们的项目中实现它时最常见的错误是什么?是否有时 https 只是个坏主意?谢谢!

最佳答案

为站点提供 HTTPS 或安全套接字层 (SSL) 证书,并且通常由证书颁发机构 (CA) 签名,该证书实际上是受信任的第 3 方,可验证有关站点的一些基本详细信息,并对其进行认证以供使用在浏览器中。如果您的浏览器信任 CA,那么它就会信任由该 CA 签署的任何证书(这称为信任链)。

每个 HTTP(或 HTTPS)请求由两部分组成:请求和响应。当您通过 HTTPS 请求某些内容时,实际上会在后台发生一些事情:

  • 客户端(浏览器)进行“握手”,请求服务器的公钥和标识。
  • 此时,浏览器可以检查有效性(站点名称是否匹配?日期范围是否当前?是否由它信任的 CA 签名?)。它甚至可以联系 CA 并确保证书有效。
  • 客户端创建一个新的预主 key ,使用服务器的公钥加密(因此只有服务器可以解密)并发送到服务器
  • 服务器和客户端都使用这个 pre-master secret 来生成 master secret,然后使用它为实际数据交换创建对称 session key
  • 双方发消息说握手结束
  • 服务器然后正常处理请求,然后使用 session key
  • 加密响应

    如果连接保持打开状态,则每个连接都将使用相同的对称 key 。

    如果建立了新连接,并且双方仍然拥有主 key ,则可以在“缩写握手”中生成新的 session key 。通常,浏览器将存储主 key 直到它关闭,而服务器将存储它几分钟或几个小时(取决于配置)。

    有关 session 长度的更多信息,请参阅 How long does an HTTPS symmetric key last?

    证书和主机名

    证书被分配了一个通用名称 (CN),对于 HTTPS,它是域名。 CN 必须完全匹配,例如,CN 为“example.com”的证书将不匹配域“www.example.com”,并且用户将在其浏览器中收到警告。

    之前 SNI ,不可能在一个 IP 上托管多个域名。因为证书是在客户端甚至发送实际 HTTP 请求之前获取的,并且 HTTP 请求包含 Host: header 行,该行告诉服务器要使用的 URL,服务器无法知道为给定的证书提供服务要求。 SNI 将主机名添加到 TLS 握手的一部分,因此只要客户端和服务器都支持它(并且在 2015 年,它被广泛支持)那么服务器就可以选择正确的证书。

    即使没有 SNI,提供多个主机名的一种方法是使用包含主题备用名称 (SAN) 的证书,SAN 本质上是证书对其有效的附加域。例如,谷歌使用单一证书来保护它的许多网站。

    Google SSL certificate

    另一种方法是使用通配符证书。有可能获得像“.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,如果您使用 session cookie,cookie 应该具有 secure flag set .这可以防止拦截 session cookie,鉴于开放(未加密)wifi 网络的流行,这尤其重要。
  • 页面上的任何资源都应该来自用于页面的相同方案。如果在页面加载 HTTPS 时尝试从 http://获取图像,用户将收到安全警告。您应该使用完全限定的 URL,或者另一种简单的方法是使用不包含主机名的绝对 URL(例如,src="/images/foo.png"),因为它们对两者都适用。
  • 这包括外部资源(例如 Google Analytics)
  • 从 HTTPS 更改为 HTTP 时不要执行 POST(表单提交)。大多数浏览器会将其标记为安全警告。
  • 关于php - PHP 开发人员需要了解哪些有关 https/安全套接字层连接的知识?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64631/

    相关文章:

    error-handling - PHP表单提交

    java - 访问被拒绝 java.lang.runtimepermission exitvm.0

    asp.net-mvc - 所有请求均出现 HTTP 错误 401.2 - 未经授权的响应

    javascript - 从 https 父窗口访问 iframe 中的 http

    ssl - 除了 OpenSSL 之外,是否还有其他工具可用于创建私钥和证书?

    php - 防止用户打开同一网站的多个实例

    php - 格式化时间无效

    sockets - 关闭套接字 FD 后 SSL session 恢复

    php - 如何在 symfony 1.4 中手动创建一个新 session

    php - 不应该使用公开的自动递增 PK 吗?