PHP: בעיית SSL ממספר שרתים שונים - unable to get local issuer certificate
-
הקוד התמים:
<?php $url = 'https://gtfs.mot.gov.il/gtfsfiles/zones_2022.zip'; // $data = call_api( $url, [] ); $data = call_api( $url ); var_dump( $data ); function call_api( $url ) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); // Receive server response ... curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE); // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // curl_setopt($ch,CURLOPT_CAINFO,'cacert.pem'); // curl_setopt($ch,CURLOPT_CAPATH,'cacert.pem'); // curl_setopt($ch, CURLOPT_CAINFO, 'ca-bundle.crt'); $server_output = curl_exec($ch); $error_msg = false; if (curl_errno($ch)) { $error_msg = curl_error($ch); } $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close ($ch); return [ 'code' => $http_code, 'output' => $server_output, 'error' => $error_msg ]; }
הרצה של הקוד הזה מביאה את התוצאה עם השגיאה:
array(3) { ["code"]=> int(0) ["output"]=> bool(false) ["error"]=> string(63) "SSL certificate problem: unable to get local issuer certificate" }
ראיתי ב-stackoverflow הצעה להוריד את תעודת האבטחה מ-https://curl.se/ca/cacert.pem אבל גם זה לא עזר (מופיע בקוד למעלה בשורה מבוטלת)
לצערי גם הפתרון שזכה שם ל-724 הצבעות לא עזר במקרה שלי
ניסיתי את הקוד משרתים שונים: אירוח אתרים של hostinger, אירוח של hostgator, שרת VPS של box
בכולם השגיאה חוזרת על עצמה
היה מי שהציע לבדוק אם הזמן בשרת מכוון, הגדרתי את ה-VPS לשעון ישראל אבל גם זה לא פתר את הבעיהבדקתי גם את ההצעה של @dovid באשכול דומה:
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
אבל גם אז אני מקבל שגיאה:
array(3) { ["code"]=> int(0) ["output"]=> bool(false) ["error"]=> string(53) "OpenSSL SSL_read: Connection reset by peer, errno 104" }
חשוב לציין שכל השרתים אינם עוברים דרך הרשת של נטפרי
-
@nigun כתב בPHP: בעיית SSL ממספר שרתים שונים - unable to get local issuer certificate:
@איש-נחמד
נראה שהאתר חסום לגישה מחו"לבדקתי גם משרת בתל אביב, האם יש דרך לבדוק את כל נתיב התעבורה שלו עד לשרת של משרד התחבורה? (כלומר - לבדוק אם הוא מזוהה בטעות במשרד התחבורה כשרת בחו"ל?)
זה גם סותר את תגובת צוות הפיתוח של משרד התחבורה שענו לי שאין הגבלה כזו -
@yossiz כתב בPHP: בעיית SSL ממספר שרתים שונים - unable to get local issuer certificate:
עכשיו בדקתי בשרת באנגליה וזה עובד לי אם משביתים בדיקת תעודות
תוכל להראות דוגמת קוד של השבתת בדיקת תעודות שעובדת?
במקרה שלי עשיתי שימוש בהגדרה הבאה שלא פתרה את הבעיה:curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
כמו שכתבתי למעלה
-
@yossiz כתב בPHP: בעיית SSL ממספר שרתים שונים - unable to get local issuer certificate:
@איש-נחמד לא ניסיתי בקוד, בדקתי על ידי פקודה זו:
wget --no-check-certificate https://gtfs.mot.gov.il/gtfsfiles/zones_2022.zip
אם גם הפקודה לא עובד לך כנראה שיש חסימה לפי מדינה/IP
מעניין שלא חשבתי על הכיוון הזה
זה עובד, ומקביל גם:curl -k -X GET -o /var/www/html/zones_2022.zip https://gtfs.mot.gov.il/gtfsfiles/zones_2022.zip
הבעיה היא שהפקודה המקבילה ב-PHP לא עובדת
עד שבסוף נפל לי הרעיון להוסיף user-agent באופן ידני וזה פתר את הבעיה... -