在这个问题上会有很多的无知,请耐心等待:
我对标准浏览器 – 客户端到服务器SSL连接的理解包括:
如果我已经弄坏了它,那么纠正我到目前为止,但现在我试图包围我的头,当SSL连接是从一个服务器作为客户端到另一个服务器充当服务器,而PHP是打电话。 它基本上是一样的过程吗? 客户端服务器是否经历了与浏览器客户端相同的步骤?
在apache环境下,客户端服务器是否需要以某种方式设置?
本质上你已经有了这个过程。 您的PHP代码在validation服务器证书方面的具体细节将取决于您用来访问服务器的方法。 例如,PHP cURL库有一个“CURLOPT_SSL_VERIFYPEER”选项, 您可以设置该选项来使库validation对等方的证书。
唯一的区别是你要写代码而不是说Mozilla。 所以如果你想,你可以决定无效的证书仍然有效。 但是,是的,同样的原则适用。 “服务器”只是一个误用。 您的服务器是连接中的客户端,它向其他服务器打开。 所以区别在于你正在编写客户端代码而不是使用它。
既然你明确邀请pedantry:
#1。 浏览器通过HTTPS连接到服务器
这是不正确的。 浏览器通过TCP(几乎总是)通过TCP(几乎总是)连接到服务器(几乎总是),在HTTPS端口443上。整个过程可以被认为是通过HTTPS连接的浏览器,但是其余的过程是冗余的。
#2。 浏览器请求服务器SSL证书
这是对的; 更具体地说,浏览器发送一个ClientHello,它包含一个协议版本号,一个随机生成的随机数 ,一个SSL会话ID(与PHPSESSID无关;这本质上是一个黑客,以避免代价高昂的密钥重新生成),支持的密码客户端套件(请参阅openssl ciphers )以及最初用于支持压缩的未使用字段。
服务器然后用一个ServerHello,它的证书,一个可选的nonce密钥和一个可选的客户端证书请求(很less使用)来响应。 然后发送完成,让浏览器知道它正在等待响应。
#3。 浏览器根据颁发该证书的第三方CA(证书颁发机构)validation证书。
浏览器还可以在链中使用附加的证书,或者本地caching,或者与服务器证书一起提供,以便链接回受信任的CA. 每个证书都被检查权限 – 只是因为我有一个证书somesite.com并不意味着我可以使用该证书签署anothersite.com的证书; 我的somesite.com证书有一个限制,说不允许签署下级证书。
#4。 浏览器和服务器通过一个开放的SSL连接进行通话,并且在build立新的连接(即下一个回传)之前不再需要/下载证书。
实际上有两个(半)更多的交stream; 客户必须certificate其拥有ClientCert,并且必须提出一个预主密钥,它将发送给服务器,由服务器的公钥encryption。 由于只有与服务器发送的证书相关联的私钥的持有者能够解密该密钥,因此客户端确信只有其预期的接收者具有其select的预主密钥。 客户端还确认它已经准备好开始发送实际的encryption数据,并将所有的数据散列到目前为止,这样服务器就可以知道它一直在跟同一个客户端通信。 最后,服务器确认他们即将开始使用相互已知的(但秘密窃听者)对称密钥进行讲话,并散列其所有数据以向客户端certificate每个人都在同一页面上。 之后,HTTP正常运行,通过Recordstream,将其encryption并encryption,而使用单独的Alertstreampipe理会话本身。
回到主题,在您的具体情况下,发出请求的服务器本身就是服务器的事实并不重要。 从它所连接的服务器的angular度来看,这只是另一个客户端。 唯一奇怪的是,服务器端不能交互地处理证书authentication错误,所以你需要确保你已经提前处理了,或者完全禁用证书authentication(fortesting,当然不是生产!),或者确保适当的CA证书可用于您select的HTTPS连接方法。