SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

  • Guten Abend,


    während ich heute an einem PHP-Projekt weitergearbeitet habe, bin ich beim Einsatz von der Funktion "file_get_contents()" auf folgende Fehler gestoßen:


    Code
    1. Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in /pfad/projectname/datei.php on line 27
    2. Warning: file_get_contents(): Failed to enable crypto in /pfad/projectname/datei.php on line 27
    3. Warning: file_get_contents(https://mydomain.tld/targetfile.txt): failed to open stream: operation failed in /pfad/projectname/datei.php on line 27



    Natürlich sprang mir dabei die Nachricht: "SSL3_GET_SERVER_CERTIFICATE:certificate verify failed" direkt ins Auge.


    Im ersten Moment war ich ein wenig verwundert, habe ich doch das SSL-Zertifikat nach dieser Anleitung generiert und konnte es auch problemlos in NGINX einbinden. Das funktioniert bereits problemlos seit über eine Woche, die Verbindung wird als sicher angezeigt und nur sehr selten bekomme ich eine Warnmeldung. (welche aber nicht durch mein Zertifikat resultiert, sondern durch dem Proxy des Avast Web-Schutzes, welchen ich dann entsprechend abstelle).



    Nun bin ich halt auf diese Meldung gestoßen und habe gleich auf Google ein wenig recharchiert. Dabei ist es erstaunlich wie unterschiedlich so manche Aussagen sein können:


    Sprechen die einen davon, das das eigene Zertifikat veraltet oder beschädigt sein soll, während andere eher davon berichten das es sich um eine Art Root-Zertifikat handelt, welche zum Abgleichen aktueller Zertifikate dringend benötigt sein soll. (klingt und erinnert mich schwer an das sich stetig pro Version neu ausgelieferte Zertifikat in den Browsern)


    Nun den, ich habe versucht ein paar Lösungsansätze zu verfolgen, allerdings hat das bisher nicht wirklich funktioniert.


    Was feststeht ist, das momentan das CRT Zertifikat als einziges überhaupt als Zertifikat erkannt wird, aber halt die oben genannte Werbung auswirft. Mit der KEY und CSR Dateien kann PHP nichts anfangen. Entsprechend ist dies auch von mir als "openssl.cafile"-Eintrag in der php.ini eingetragen und auskommentiert worden.



    Als dann auch noch andere davon berichteten das man die CSR, CRT und KEY Datei zu
    einer einzigen PEM Datei verschmelzen soll, wurde ich so langsam skeptisch und habe meine bisherigen Änderungen um das Problem zu lösen wieder rückgängig gemacht und frage entsprechend nun vorher lieber hier (im Forum) nach Rat.


    Für mich ist das Thema SSL noch recht Neu, von daher vielen Dank im vorraus!



    Serverdetails: Debian 8.2 (Jessie) - PHP 5.6 - NGINX 1.6.2

  • "certificate verify failed" ist der relevante Teil und ganz spontan würde ich zwei Dinge vermuten, die Du überprüfen solltest:

    • Paket ca-certificates ist nicht installiert? (zur Validierung der CA im PHP-Script)
    • Das Zwischenzertifikat der CA ist beim Webserver mit dem Problem-Zertifikat nicht eingebunden?


    Falls beides bereits der Fall ist, prüfe einmal folgendes: Ergibt der Abruf über curl/wget eine Fehlermeldung? Eventuell kannst Du uns auch noch folgende Details nachreichen:

    Code
    1. echo QUIT | openssl s_client -connect "example.com:443" -servername "example.com" -status



    MfG Christian

  • Hallo Christian,


    mit dem Befehl zum überprüfen der Verbindung, hast du mich direkt in die richtige Richtung gestoßen! Durch Ihn bekam ich diese Meldung:


    Code
    1. No client certificate CA names sent
    2. ...
    3. Verify return code: 21 (unable to verify the first certificate)


    Was mich nach ein bisschen Google dazu führte, das RapidSSL SHA256 CA - G3 Zertifikat von RapidSSL zu beziehen und mit meinem zusammenzuführen (cat xx yy >> zz) und zu laden.


    Mit deinem Befehl erhalte ich nun:


    Code
    1. Verify return code: 20 (unable to get local issuer certificate)


    Füge ich den "-CApath /pfad/zu/sslcerts/"-Paremeter noch hinzu:


    Code
    1. Verify return code: 0 (ok)


    Nun habe ich diese auch bei NGINX ausgetauscht und siehe da, Fehlermeldung, ade.
    Okay, auch ohne Sie dort auszutauschen (ist ausgetauscht), spuckt PHP kein Fehler mehr aus. (da der capath bereits von mir in der php.ini angegeben wurde)


    Von daher vielen Dank, hab einiges dabei lernen können!