本文主要介绍PHP Curl SNI的相关知识。
众所周知,HTTPS是比HTTP更加安全的协议。对于HTTPS来说,通常我们会使用TLS作为加密通信的手段。当我们使用Curl进行HTTPS通信时,我们也一般会使用SNI(Server Name Indication)这一机制。
SNI可以在一个服务器上设置多个域名,比如:example1.com、example2.com等,再通过不同的证书来做加密。这样,Curl请求的时候就可以根据请求域名来识别需要使用哪个证书来建立加密通道。
// 使用Curl设置SNI例子:$ch = curl_init("https://api.example.com/");curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);curl_setopt($ch, CURLOPT_CAINFO, "/path/to/ca-bundle.crt");curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, "ECDHE-RSA-AES256-SHA384");curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, CURL_SSLVERSION_MAX_TLSv1_2);curl_setopt($ch, CURLOPT_SSL_SESSIONID_CACHE, false);curl_setopt($ch, CURLOPT_HTTPHEADER, array("Host: api.example.com"));curl_setopt($ch, CURLOPT_HEADER, true);curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);$response = curl_exec($ch);
在上面的例子中,我们可以看到通过设置CURLOPT_HTTPHEADER选项,我们可以设置请求域名,从而让Curl根据SNI机制来选择合适的证书进行加密通信。
当然,SNI机制只支持一定版本的SSL/TLS协议。比如Windows XP下的IE6是不支持SNI机制的,这个时候Curl就不能使用SNI来进行HTTPS通信了。而且我们也需要注意有些国内的CDN不支持SNI机制。
总之,当我们在使用Curl进行HTTPS通信时,需要使用SNI机制来确保通信的安全性。当然需要注意兼容性问题,以及与国内CDN之间的通信问题。