08/01/2021
Som PHP-udvikler er der få ting så frustrerende som en uventet fejl, der stopper dit arbejde. En af de mere kryptiske fejl, mange støder på, især siden PHP 5.6, er: Warning: getimagesize(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed. Denne fejl opstår typisk, når du forsøger at hente dimensionerne på et billede fra en URL, der bruger HTTPS. Pludselig kan din kode ikke længere kommunikere sikkert, og dit script fejler.

Denne fejl er ikke bare en tilfældig teknisk hikke; den er et symptom på et dybereliggende problem med tillid i den digitale verden. Din PHP-installation kan simpelthen ikke verificere ægtheden af det SSL-certifikat, som webserveren præsenterer. I denne artikel vil vi dykke ned i, hvad denne fejl betyder, hvorfor den opstår i forskellige miljøer som produktionsservere (CentOS) og lokale opsætninger (XAMPP), og vigtigst af alt, hvordan du løser den permanent og sikkert.
Hvad Betyder "SSL operation failed with code 1"?
For at forstå fejlen, må vi først forstå, hvad der sker bag kulisserne. Når din PHP-kode kalder en funktion som getimagesize() på en https:// URL, forsøger den at etablere en sikker, krypteret forbindelse til den eksterne server. Denne proces, kendt som et SSL/TLS-håndtryk, er fundamental for sikker kommunikation på internettet.
En afgørende del af dette håndtryk er certifikatverifikation. Den server, der hoster billedet, præsenterer sit SSL-certifikat. Din server (hvor PHP-koden kører) skal derefter validere dette certifikat. Det gør den ved at sammenligne certifikatets udsteder (Certificate Authority, CA) med en lokal liste over betroede CA'er. Denne liste kaldes et "CA bundle" eller "trust store".

Fejlen certificate verify failed betyder, at denne validering er slået fejl. Din server siger i bund og grund: "Jeg har modtaget et certifikat, men jeg kan ikke bekræfte, at det er udstedt af en autoritet, jeg stoler på. Derfor afviser jeg forbindelsen for at undgå en potentiel sikkerhedsrisiko." Dette er en vigtig sikkerhedsforanstaltning, der beskytter mod man-in-the-middle-angreb, hvor en ondsindet tredjepart kan opsnappe og manipulere data.
Almindelige Årsager til Certifikatfejl
Fejlen kan opstå i mange forskellige scenarier, men årsagerne falder typisk ind under et par hovedkategorier:
- Forældet CA-certifikatpakke: Serveren, der kører PHP, har en forældet liste over betroede certifikatudstedere. Når en hjemmeside bruger et certifikat fra en nyere CA, vil din server ikke genkende den og afvise forbindelsen. Dette er en almindelig årsag på servere, der ikke opdateres regelmæssigt.
- Selvsignerede Certifikater: I lokale udviklingsmiljøer som XAMPP, MAMP eller Local by Flywheel er det almindeligt at bruge selvsignerede SSL-certifikater til at teste HTTPS lokalt. Disse certifikater er ikke udstedt af en anerkendt CA, så PHP's OpenSSL-modul vil som standard ikke stole på dem. Dette forklarer, hvorfor
getimagesize()virker på enhttp://URL, men fejler på den tilsvarendehttps://URL i et lokalt miljø. - Manglende eller Forkert Konfiguration i
php.ini: PHP skal vide, hvor den kan finde sin CA-certifikatpakke. Hvis stien iphp.ini-filen (typisk direktiverneopenssl.cafileellercurl.cainfo) er forkert, tom, eller peger på en ugyldig fil, vil enhver SSL-verifikation fejle. - Proxy eller Firewall: I nogle virksomhedsnetværk kan en proxy-server eller firewall inspicere SSL-trafik. Dette kan nogle gange bryde certifikatkæden og få PHP's verifikation til at fejle.
Løsning på Produktionsservere (f.eks. CentOS/Linux)
På en live server er den absolut bedste og mest sikre løsning at sikre, at systemets lager af betroede certifikater er opdateret. Dette løser problemet på systemniveau, så ikke kun PHP, men også andre programmer som cURL og Wget, vil fungere korrekt. Det er en robust løsning, der adresserer kernen af problemet.
Fremgangsmåden varierer lidt afhængigt af din Linux-distribution:
For CentOS/RHEL/Fedora:
Disse systemer bruger update-ca-trust-værktøjet. Du kan opdatere dine certifikater med to simple kommandoer:
# Først, installer eller opdater ca-certificates pakken yum install ca-certificates -y # Kør derefter opdateringsværktøjet update-ca-trustDenne proces genopbygger systemets liste over betroede CA'er og gør dem tilgængelige for applikationer som PHP.
For Debian/Ubuntu:
På Debian-baserede systemer er kommandoen lidt anderledes:
# Opdater pakkelisten og installer/opdater pakken sudo apt-get update sudo apt-get install ca-certificates -y # Opdater certifikaterne sudo update-ca-certificatesEfter at have kørt disse kommandoer, bør du genstarte din webserver (Apache/Nginx) og PHP-FPM for at sikre, at ændringerne træder i kraft. Herefter skulle din getimagesize()-funktion virke uden problemer.

Løsninger til Lokale Udviklingsmiljøer (XAMPP, MAMP)
I et lokalt miljø, hvor du ofte arbejder med selvsignerede certifikater, er problemet et andet. Her er systemet ikke forældet, men det er bevidst konfigureret til ikke at stole på dine lokale certifikater. Her er et par metoder til at løse dette.
Metode 1: Konfigurer php.ini Manuelt (Anbefalet)
Denne metode indebærer at fortælle PHP, hvor den kan finde en opdateret liste over CA'er. Dette er en sikker og pålidelig måde at løse problemet på lokalt.
- Download den seneste CA-pakke: Gå til cURL's hjemmeside og download den seneste
cacert.pem-fil. Dette er en standardiseret fil, der indeholder certifikater fra de fleste store CA'er. Link: http://curl.haxx.se/ca/cacert.pem (Kopier og indsæt linket, da direkte links ikke er tilladt her). - Placer filen et sikkert sted: Gem
cacert.pem-filen et sted i din XAMPP/MAMP-installation, hvor den ikke bliver slettet ved en opdatering. Et godt sted kunne væreC:\xampp\php\extras\ssl\cacert.pem. - Rediger din
php.ini-fil: Find denphp.ini-fil, som din Apache-server bruger (du kan finde stien ved at kørephpinfo();). Åbn filen og find linjerne foropenssl.cafileogcurl.cainfo. Opdater dem til at pege på din nye fil. Sørg for at fjerne semikolonet (;) i starten af linjen for at aktivere den.
[curl] ; A default value for the CURLOPT_CAINFO option. This is required to be an ; absolute path. ;curl.cainfo = curl.cainfo = "C:\xampp\php\extras\ssl\cacert.pem"[openssl] ; The location of a Certificate Authority list file (bundle). ;openssl.cafile= openssl.cafile="C:\xampp\php\extras\ssl\cacert.pem"4. Genstart Apache: Gem php.ini-filen og genstart din Apache-server fra XAMPP-kontrolpanelet. Dette tvinger PHP til at genindlæse konfigurationen, og nu skulle den kunne verificere SSL-certifikater korrekt.

Metode 2: Deaktiver SSL-verifikation i Koden (Kun til Lokal Test!)
Dette er en hurtig løsning, men den kommer med en stor sikkerhedsadvarsel. Du kan instruere PHP om at springe certifikatverifikationen over for et specifikt kald. BRUG ALDRIG DENNE METODE I PRODUKTION! Den fjerner en vigtig sikkerhedsbarriere.
For at gøre dette, opretter du en "stream context" med specifikke SSL-indstillinger og sender den med til getimagesize():
<?php $imageUrl = "https://dit-lokale-domæne.test/billede.jpg"; // Opret en stream context, der deaktiverer SSL-verifikation $contextOptions = [ "ssl" => [ "verify_peer" => false, "verify_peer_name" => false, ], ]; $context = stream_context_create($contextOptions); // Send context med til getimagesize() // Bemærk: Yderligere info skal med, selvom det er en tom array $imageInfo = getimagesize($imageUrl, $imageinfo, $context); if ($imageInfo) { echo "Billedet blev hentet succesfuldt!"; print_r($imageInfo); } else { echo "Kunne ikke hente billedinformation."; } ?>Ved at sætte verify_peer og verify_peer_name til false, ignorerer PHP fuldstændigt certifikatvalideringen. Dette er kun acceptabelt i et lukket, lokalt miljø, hvor du har fuld kontrol og stoler på den server, du kommunikerer med (fordi det er din egen maskine).
Sammenligning af Løsninger
For at give et klart overblik, er her en tabel, der sammenligner de forskellige metoder:
| Løsning | Fordele | Ulemper | Bedst til |
|---|---|---|---|
| Opdater systemcertifikater | Løser problemet globalt, høj sikkerhed, best practice. | Kræver root/sudo adgang, virker ikke for selvsignerede certifikater. | Produktionsservere (Linux). |
| Konfigurer php.ini | Sikker, pålidelig, løser problemet for hele PHP-installationen. | Kræver manuel download og konfiguration. | Lokale udviklingsmiljøer (XAMPP, MAMP). |
| Deaktiver verifikation i kode | Hurtig, kræver ingen serverkonfiguration. | Meget usikkert, bør aldrig bruges i produktion. Skal implementeres i hvert kald. | Hurtig debugging i et kontrolleret lokalt miljø. |
Ofte Stillede Spørgsmål (FAQ)
- Hvorfor virker min kode med
http://men ikkehttps://? - Fordi
httper en ukrypteret protokol, der ikke bruger SSL-certifikater. Derfor finder der ingen certifikatverifikation sted, og fejlen opstår ikke.httpser den sikre version, som kræver en vellykket verifikation. - Er det virkelig så farligt at deaktivere
verify_peer? - Ja, i et produktionsmiljø er det ekstremt farligt. Det åbner din applikation for man-in-the-middle-angreb, hvor en angriber kan udgive sig for at være den legitime server, opsnappe data (f.eks. API-nøgler, brugerdata) og endda sende falske data tilbage til din applikation. Gør det kun i et lokalt miljø, du stoler 100% på.
- Jeg har opdateret min
php.ini, men fejlen er der stadig. Hvad gør jeg galt? - De mest almindelige årsager er: 1) Du har redigeret den forkerte
php.ini-fil (brugphpinfo()til at finde den korrekte sti). 2) Du har glemt at genstarte din webserver (Apache/Nginx). 3) Stien tilcacert.pem-filen i din konfiguration er forkert, eller filen har ikke de korrekte læserettigheder. Dobbelttjek stien og filnavnet nøje.
Konklusion
PHP-fejlen "SSL operation failed with code 1" er i sidste ende ikke en fejl i PHP, men en vigtig sikkerhedsfunktion, der fungerer efter hensigten. Den fortæller dig, at der er et problem med tilliden mellem din server og den server, du forsøger at kontakte. I stedet for at omgå problemet med usikre metoder, er den bedste tilgang altid at løse det underliggende tillidsproblem. For produktionsservere betyder det at holde systemets certifikater opdateret. For lokal udvikling betyder det at konfigurere PHP korrekt til at genkende en gyldig liste af certifikatudstedere. Ved at følge disse retningslinjer kan du ikke kun løse den irriterende certifikatfejl, men også sikre, at din applikation forbliver robust og sikker.
Hvis du vil læse andre artikler, der ligner PHP getimagesize(): Løs SSL-certifikatfejl, kan du besøge kategorien Sundhed.
