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 התייחס לנושא זה ב Y yossiz התייחס לנושא זה ב
 

