本文主要介紹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之間的通信問題。