了解服务器到服务器 SSL

了解服务器到服务器 SSL

这个问题会涉及很多无知,所以请耐心等待:

我对标准浏览器客户端到服务器 SSL 连接的理解包括:

  1. 浏览器通过 HTTPS 连接服务器
  2. 浏览器请求服务器 SSL 证书
  3. 浏览器根据颁发证书的第三方 CA(证书颁发机构)来验证证书。
  4. 浏览器和服务器通过开放的 SSL 连接进行通信,并且在建立新的连接(即下一次回发)之前不需要/再次下载证书。

如果我已经弄错了,请纠正我,但现在我正试图弄清楚当从一台充当客户端的服务器到另一台充当服务器的服务器建立 SSL 连接时会发生什么,并且 PHP 正在进行调用。这本质上是相同的过程吗?客户端-服务器是否经历与浏览器-客户端相同的步骤?

在 Apache 环境中,客户端-服务器是否需要以某种方式进行设置?

答案1

基本上,您已经了解了这个过程。PHP 代码在验证服务器证书时的具体操作将取决于您用于访问服务器的方法。PHPcURL 库例如,有一个 'CURLOPT_SSL_VERIFYPEER' 选项您可以设置让图书馆验证对方的证书。

答案2

唯一的区别是您要编写代码,而不是 Mozilla。因此,如果您愿意,您可以决定非有效证书仍将有效。但是,是的,同样的原则适用。“服务器”只是一个误称。您的服务器是它打开到其他服务器的连接中的客户端。因此,区别在于您编写的是客户端代码,而不是使用它。

答案3

既然你明确地邀请了迂腐:

#1. 浏览器通过 HTTPS 连接服务器

这是不正确的。浏览器 (几乎总是) 通过 TCP 连接到服务器,(几乎总是) 在 HTTPS 端口 443 上。整个过程可以视为浏览器通过 HTTPS 连接,但其余过程是多余的。

#2. 浏览器请求服务器 SSL 证书

这是正确的;更具体地说,浏览器发送一个 ClientHello,它由协议版本号、随机生成的随机数、SSL 会话 ID(与 PHPSESSID 之类的无关;这本质上是一种避免昂贵的密钥再生的黑客攻击)、客户端支持的密码套件(请参阅openssl ciphers),以及原本用于支持压缩的未使用字段。

然后,服务器会以 ServerHello、其证书、可选的随机数密钥以及可选的客户端证书请求(很少使用)进行响应。然后,它会发送 Done 以让浏览器知道它正在等待其响应。

#3. 浏览器根据颁发证书的第三方 CA(证书颁发机构)验证证书。

浏览器还可以使用链中的其他证书(本地缓存或与服务器证书一起提供),以便链接回受信任的 CA。每个证书都会经过权限检查 - 仅仅因为我拥有 somesite.com 的证书并不意味着我可以使用该证书为 anothersite.com 签署证书;我的 somesite.com 证书有一个限制,规定不允许签署下属证书。

#4. 浏览器和服务器通过开放的 SSL 连接进行通信,在建立新连接(即下一次回发)之前不需要/再次下载证书。

实际上还有两次(半)交换;客户端必须证明其拥有 ClientCert,并且必须提出一个预主密钥,它将通过服务器的公钥加密该密钥,并将其发送给服务器。由于只有与服务器发送的证书相关联的私钥的持有者才能解密此密钥,因此客户端可以确保只有其预期的接收者拥有它所选择的预主密钥。客户端还确认它已准备好开始发送实际的加密数据,并对到目前为止的所有数据进行哈希处理,以便服务器可以知道它一直在与同一个客户端对话。最后,服务器确认他们即将使用双方都知道的(但对窃听者来说是秘密的)对称密钥开始对话,并对所有数据进行哈希处理,以向客户端证明每个人都在同一页面上。此后,HTTP 照常进行,遍历记录流,将其切分并加密,同时使用单独的警报流来管理会话本身。

回到正题,在您的具体情况下,发出请求的服务器本身就是服务器这一事实并不重要。从它所连接的服务器的角度来看,它只是另一个客户端。唯一奇怪的一点是,服务器客户端无法以交互方式处理证书身份验证错误,因此您需要确保提前处理它们,要么完全禁用证书身份验证(当然是为了测试,而不是为了生产!),要么确保您选择的 HTTPS 连接方法可以使用适当的 CA 证书。

相关内容