PHP: file_get_contents() failed with SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
วันนี้ผมมาแชร์ error ที่เกิดจากการเรียกใช้ function file_get_contents() บน php ตัวฟังก์ชันนี้ปกติเราใช้ในการดึงข้อมูลขจากเว็บไซต์มาเก็บในตัวแปรเป็น String เช่น มีเว็บไซต์ให้บริการข้อมูลอัพเดทค่าเงิน โดยเรียกผ่าน api url ที่เขากำหนด
ตัวอย่าง api url “https://blockchain.info/ticker” ให้บริการข้อมูลราคาค่าเงินสกุลต่างๆ โดยส่งข้อมูลออกมาดังตัวอย่าง
{ "AUD" : {"15m" : 46766.08, "last" : 46766.08, "buy" : 46766.08, "sell" : 46766.08, "symbol" : "AUD"}, "BRL" : {"15m" : 179884.98, "last" : 179884.98, "buy" : 179884.98, "sell" : 179884.98, "symbol" : "BRL"}, "CAD" : {"15m" : 43281.72, "last" : 43281.72, "buy" : 43281.72, "sell" : 43281.72, "symbol" : "CAD"}, ... }
เมื่อเราต้องการดึงข้อมูลจาก api url นี้มาเก็บ เราจะเรียกใช้ฟังก์ชัน file_get_contetns($url) ดังนี้
$url=”https://blockchain.info/ticker”;
$json = file_get_contents($url);
ตัวแปร $json ถ้าดึงข้อมูลได้เราจะสามารถใช้คำสั่ง “echo $json; ” แสดงข้อมูลออกมาได้ แต่ในกรณีนี้กลับขึ้นข้อความดังนี้
Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:
error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version in ...
เบื้องต้นได้ลองเช็ค openssl version จาก phpinfo() พบว่าเป็นเวอร์ชัน “OpenSSL 0.9.8zh” และได้ลองทดสอบ file_get_contents() จากอีกเครื่องที่สามารถดึงข้อมูลได้ พบว่าเป็นเวอร์ชัน “OpenSSL 1.0.1e-fips” จึงทดลองอัพเกรด APP SERVER ทำให้ได้ OpenSSL 1.0.2u 20 และทดสอบโค้ดอีกครั้ง พบว่า Error “SSL23_GET_SERVER_HELLO” หายไปแล้วครับ