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" }חשוב לציין שכל השרתים אינם עוברים דרך הרשת של נטפרי
-
הקוד התמים:
<?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:
עכשיו בדקתי בשרת באנגליה וזה עובד לי אם משביתים בדיקת תעודות
תוכל להראות דוגמת קוד של השבתת בדיקת תעודות שעובדת?
במקרה שלי עשיתי שימוש בהגדרה הבאה שלא פתרה את הבעיה:curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);כמו שכתבתי למעלה
-
@איש-נחמד לא ניסיתי בקוד, בדקתי על ידי פקודה זו:
wget --no-check-certificate https://gtfs.mot.gov.il/gtfsfiles/zones_2022.zipאם גם הפקודה לא עובד לך כנראה שיש חסימה לפי מדינה/IP
@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 באופן ידני וזה פתר את הבעיה... -
Y yossiz התייחס לנושא זה ב
שלום! נראה שהשיחה הזו מעניינת אותך, אבל עדיין אין לך חשבון.
נמאס לכם לגלול בין אותם הפוסטים בכל ביקור? כשנרשמים לחשבון, תמיד תחזרו בדיוק למקום שבו הייתם קודם, ותוכלו לבחור לקבל התראות על תגובות חדשות (בין אם במייל, ובין אם בהתראת פוש). תוכלו גם לשמור סימניות ולפרגן ב-upvote לפוסטים כדי להביע הערכה לחברי קהילה אחרים.
בעזרת התרומה שלך, הפוסט הזה יכול להיות אפילו טוב יותר 💗
הרשמה התחברות