Client-Server-Auth schlägt fehl (komplexes Problem)

tuxxer

New Member
Hallo Community...

ich habe ein etwas komplexes Problem, das sich nur schwer erklären lässt. Mein Hauptproblem ist das, dass der Fehler mutmaßlich an völlig unterschiedlichen Stellen lauern kann.

Also:

Mein Server: Apache 2.2.16 / Debian 6.0 / PHP 5.3.3

Ich möchte via PHP (file_get_contents) Daten von einer Webseite einlesen. Der Server, auf dem die Webseite läuft, verlangt eine Zertifikat-basierte Authentifizierung. Der Anbieter des Webservices hat mir hierfür ein p12-Zertifikat aus- und zugestellt, das ich ordnungsgemäß "zerlegt" habe.
Mein selbst erstellter vHost (in /etc/apache2/sites-enabled) sieht wie folgt aus:

Code:
<VirtualHost IP.0.0.0:443>
## bla bla
SSLEngine on
SSLCertificateFile /pfad/zu/meinem/server.crt
SSLCertificateKeyFile /pfad/zu/meinem/key.key
SSLCertificateChainFile /pfad/zur/certificate-kette.crt
SSLCACertificateFile /pfad/zum/austeller.crt
## bla bla
</VirtualHost>

Meine Webseiten, die auf oben genanntem Server liegen, sind nun alle über "https://" erreichbar, nachdem man bestätigt hat, dass es sich beim Zertifikat-Aussteller um keinen vertrauenswürdigen Aussteller handelt (logisch).

Mein Problem ist nun aber, dass "php_file_get_contents" (auch fopen) folgende Fehlermeldung liefert:

Code:
Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure in /var/....php on line 4 Warning: file_get_contents(): Failed to enable crypto in /var/...php

openssl ist definitv aktiv!
allow_url_fopen ist aktiv!

Ich kann auch problemlos andere "https://"-Seiten mit "file_get_contents" einlesen (z.B. https://www.facebook.com).

PHP:
$w = stream_get_wrappers();
echo 'openssl: ',  extension_loaded  ('openssl') ? 'yes':'no', "\n";
echo 'http wrapper: ', in_array('http', $w) ? 'yes':'no', "\n";
echo 'https wrapper: ', in_array('https', $w) ? 'yes':'no', "\n";

liefert:

Code:
openssl: yes http wrapper: yes https wrapper: yes

Ich möchte also behaupten, dass PHP-seitig alles in Ordnung ist.

Ich denke nun, dass es an zwei Kanten hängen kann:

1. Das Zertifikat stimmt nicht

2. Dieser Bug: https://bugs.launchpad.net/ubuntu/+source/php5/+bug/592442

Leider weiß ich nicht, wie ich testen kann, ob das Zertifikat stimmt.
Hat jemand eine Idee?
 
Ich würde sagen, das SSL-Zertifikat des Zielservers ist unbekannt/nicht in Ordnung!
Vielleicht ist das CA-Zertifikat des Zielservers nicht in /etc/ssl/certs

Denn ich bekomme beim Abruf einer Seite über SSL, dessen Zertifikat unbekannt ist:
Code:
~ php x.php
PHP Warning:  file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: 
error:14077458:SSL routines:SSL23_GET_SERVER_HELLO:reason(1112) in x.php on line 3
PHP Warning:  file_get_contents(): Failed to enable crypto in x.php on line 3
PHP Warning:  file_get_contents(https://********.de): failed to open stream: operation failed in x.php on line 3
 
Last edited by a moderator:
So... danke erst einmal für Eure Antworten.

Ich bin ein Stück weiter. Unter Verwendung der folgenden Anleitung aus 2005 ;-) -> http://curl.haxx.se/mail/archive-2005-09/0138.html
kann ich aus der Konsole heraus eine Verbindung zur Webseite aufbauen. Leider weiß ich nicht, wie ich alle Parameter in eine PHP-Funktion packe. Im Terminal sieht das ganze wie folgt aus:

Code:
curl -d "parameter=123"  -G -v --key key.pem --cacert
ca.pem --cert client.pem:xxxxxx https://www.webservice.xyz
 
Ich bin ja kein php-Programmierrer aber das sieht für mich exakt nach einem Anwendungsfall für den Code aus, der in dem von mir oben geposteten Link enthalten ist...
 
Ich bin ja kein php-Programmierrer aber das sieht für mich exakt nach einem Anwendungsfall für den Code aus, der in dem von mir oben geposteten Link enthalten ist...

dem ist auch (fast) so.
Wie ich bereits sagte: In dem von Dir verlinkten Beispiel wird mit Curl das Zertifikat als "Mix-Datei" (Zertifikate und Schlüssel in einer Datei) gearbeitet. Dieses Beispiel schlug bei mir so sowohl auf Kommandozeilen-Ebene, wie auch als PHP-Skript fehl.

Fehlermeldung bei beiden:

curl: (58) unable to use client certificate (no key found or wrong pass phrase?)

Nach der von mir verlinkten Anleitung und der "Zerlegung" der PEM-Datei in Schlüssel-Datei, Client- und CA-Zertifikat geht es aber.
 
Back
Top