[PHP] Curl Fout SSL3_GET_SERVER_CERTIFICATE

Pagina: 1
Acties:
  • 760 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • JoostMartijn
  • Registratie: December 2003
  • Laatst online: 17-04 15:22
Hallo,

Ik ben bezig met een scriptje dat gebruik maakt van Curl. Ik heb dit al vele malen uitgevoerd o.a. met Tripledeal. Nooit problemen mee gehad die ik niet kon oplossen, tot nu. Ik krijg de volgende fout melding. Heeft iemand hier ervaringen mee? En nog belangrijk hoe ik deze kan oplossen :).

Ik heb een certificate geinstalleerd binnen IIS op de webserver. Dit is zover ik kan testen goed gegaan. Als ik de pagina waar het op gaat aanroep met https:// dan werkt dit.

code:
1
Error: SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed


Het script dat ik hiervoor gebruik is:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
 $URL = "https://www.test.test";
 $headers = array("Content-type: text/xml;charset=\"utf-8\"","Accept:text/xml","Cache-Control: no-cache","Content-length: ".strlen($xml));
  
  $ch = curl_init();
  curl_setopt ($ch, CURLOPT_URL, "$URL");
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_TIMEOUT, 60);
  curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
  curl_setopt($ch, CURLOPT_USERAGENT, $defined_vars['HTTP_USER_AGENT']);
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
  
  $data = curl_exec($ch);

Windsoft


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Staan de Datums op beide systemen wel goed? Anders kan het zijn dat het lijkt alsof het certificaat nog niet geldig is/verlopen is.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Is het een gekocht certificaat of een 'self-signed' certificaat?

In het laatste geval zou je in Java bijvoorbeeld tegen het probleem aanlopen dat de boom van signerende instanties niet afgelopen kan worden tot een partij die een certificaat in de 'ultimately trusted' file heeft. Ik weet niet of PHP ook zoiets heeft, maar het zou me niets verbazen. Dan moet je eerst een self-signed CA certificaat aanmaken, daarmee een nieuw certificaat voor je server aanmaken en die in de 'ultimately trusted' keystore stoppen.

In het eerste geval kan het zijn dat je in geval van een nieuwe instantie en een oude keystore ook het certificaat van die instantie nog niet hebt. Dan moet je die even toevoegen.

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

  • JoostMartijn
  • Registratie: December 2003
  • Laatst online: 17-04 15:22
Ja, de datums zijn goed.

Ik ben al een stap verder. Het is een cerificaat dat ik heb gekregen en wat ik moet mee verzenden in CURL aanvraag. Ik heb het nu zo:

PHP:
1
2
3
4
5
6
7
8
9
10
 $sslcertpath = $_SERVER['DOCUMENT_ROOT'] . "\\test.crt"; 
  $sslkeypath = $_SERVER['DOCUMENT_ROOT'] . "\\test2.cer";   

  $ch = curl_init();
  curl_setopt ($ch, CURLOPT_URL, "$URL");
  curl_setopt($ch, CURLOPT_SSLCERT, $sslcertpath); 
  curl_setopt($ch, CURLOPT_SSLKEY, $sslkeypath); 
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); 
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);


Ik krijg nu de volgende fout melding:

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


Het probleem is dat ik het wachtwoord in een tekst document heb en niet in een file als *.key of *.pem. Ik weet ook niet precies hoe je zo'n file zou moeten maken. Gewoon hernoemen of de text file gebruiken werkt niet. Het cetificaat exporteren en die gebruiken (=test2.crt) werkt ook niet. Allemaal de zelfde fout :S.

Windsoft


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Het gaat dus niet om een Server Certificaat maar om een client certificaat. Blijkbaar gaat er iets mis met het inlezen van het certificaat.

Je zou eens wat met OpenSSL tools kunnen proberen om het certificaat te testen.

Ik had even snel gegoogled op de veschillende opties die je kan zetten. Aangezien je geen pem formaat key hebt zul je

CURLOPT_SSLKEYTYPE

moeten zetten. Volgens mij is een .cer file in het DER formaat, maar dat zou je eventueel met OpenSSL kunnen controleren en eventueel converteren naar PEM

eventueel moet je ook nog CURLOPT_SSLKEYPASSWD gebruiken als de key beveiligd is met een password

[ Voor 48% gewijzigd door Woy op 28-01-2008 13:47 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Confusion schreef op maandag 28 januari 2008 @ 13:04:
Is het een gekocht certificaat of een 'self-signed' certificaat?

In het laatste geval zou je in Java bijvoorbeeld tegen het probleem aanlopen dat de boom van signerende instanties niet afgelopen kan worden tot een partij die een certificaat in de 'ultimately trusted' file heeft. Ik weet niet of PHP ook zoiets heeft, maar het zou me niets verbazen. Dan moet je eerst een self-signed CA certificaat aanmaken, daarmee een nieuw certificaat voor je server aanmaken en die in de 'ultimately trusted' keystore stoppen.

In het eerste geval kan het zijn dat je in geval van een nieuwe instantie en een oude keystore ook het certificaat van die instantie nog niet hebt. Dan moet je die even toevoegen.
Dit type probleem heb ik ook ooit gehad met een client certificate wat ik verstrekt kreeg door een derde partij. Wat bleek: CURL heeft zelf uiteraard ook een lijst met trusted root certificates, en die kan natuurlijk (deels) achterhaald raken. Navraag bij de derde partij leverde een tweetal bijgewerkte intermediary certificates op, die na "installatie" in de store van CURL een werkend client certificate opleverde.

In jouw geval kan het uiteraard ook zo zijn (zoals al gesuggereerd werd) dat je key file niet gelezen kan worden omdat deze niet in het juiste format is. Met google zijn echter makkelijk links te vinden waar wordt uitgelegd hoe je e.e.a. converteert naar een format waar OpenSSL wel wat mee kan.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
B-Man schreef op maandag 28 januari 2008 @ 14:53:
[...]

Dit type probleem heb ik ook ooit gehad met een client certificate wat ik verstrekt kreeg door een derde partij. Wat bleek: CURL heeft zelf uiteraard ook een lijst met trusted root certificates, en die kan natuurlijk (deels) achterhaald raken. Navraag bij de derde partij leverde een tweetal bijgewerkte intermediary certificates op, die na "installatie" in de store van CURL een werkend client certificate opleverde.

In jouw geval kan het uiteraard ook zo zijn (zoals al gesuggereerd werd) dat je key file niet gelezen kan worden omdat deze niet in het juiste format is. Met google zijn echter makkelijk links te vinden waar wordt uitgelegd hoe je e.e.a. converteert naar een format waar OpenSSL wel wat mee kan.
De fout in de eerste post zou dat idd ook aan kunnen geven, de laatste post die de TS geeft is echter anders en daar lijkt het niet op een CA fout te gaan

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1