草庐IT

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

coder 2023-12-30 原文

关于 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 本质上是证书对其有效的附加域。例如,谷歌使用单一证书来保护它的许多网站。



    另一种方法是使用通配符证书。有可能获得像“.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/

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

    1. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

      我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

    2. ruby - 续集在添加关联时访问many_to_many连接表 - 2

      我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

    3. ruby - 无法在 60 秒内获得稳定的 Firefox 连接 (127.0.0.1 :7055) - 2

      我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类

    4. Ruby Sinatra 配置用于生产和开发 - 2

      我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

    5. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

      我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

    6. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

      这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

    7. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

      我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

    8. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

      无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

    9. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

      在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

    10. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

      1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

    随机推荐