cURL is unable to use client certificate , in local server

10,108

Try exchanging your files like so:

curl_setopt($ch, CURLOPT_CAINFO, getcwd().'ipm.pem');
curl_setopt($ch, CURLOPT_SSLCERT, getcwd().'ipm.crt');

I suspect you have them the wrong way round.

Share:
10,108
donparalias
Author by

donparalias

(your about me is currently blank)

Updated on June 04, 2022

Comments

  • donparalias
    donparalias almost 2 years

    I set up a local server using XAMPP. I have two PHP scripts , a sender and a receiver. I am trying to send an XML file from the sender to the receiver using HTTP over SSL (HTTPS).

    I created a self signed certificate, configured XAMPP, and I am using this code on my sender :

    <?php
      /*
       * XML Sender/Client.
       */
      // Get our XML. You can declare it here or even load a file.
    
    
      $xml = file_get_contents("data.xml");
    
      // We send XML via CURL using POST with a http header of text/xml.
      $ch = curl_init();
    
      //curl_setopt($ch, CURLOPT_SSLVERSION,3);
    
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    
      curl_setopt($ch, CURLOPT_CAINFO,  getcwd().'ipm.crt');
      curl_setopt($ch, CURLOPT_SSLCERT, getcwd().'ipm.pem');
    
      curl_setopt($ch, CURLOPT_SSLCERTPASSWD,'pass');
    
      //i use this line only for debugging through fiddler. Must delete after done with debugging.
      curl_setopt($ch, CURLOPT_PROXY, '127.0.0.1:8888');
    
      // set URL and other appropriate options
      curl_setopt($ch, CURLOPT_URL, "https://ipv4.fiddler/iPM/receiver.php");
      curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
      curl_setopt($ch, CURLOPT_HEADER, 0);
      curl_setopt($ch, CURLOPT_POST, 1);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
      curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
      curl_setopt($ch, CURLOPT_REFERER, 'https://ipv4.fiddler/iPM/receiver.php');
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      $ch_result = curl_exec($ch);
      echo "Result = ".$ch_result;
    
      echo 'Curl error: ' . curl_error($ch);
    
      curl_close($ch);
      // Print CURL result.
    ?>
    

    However i always get this error : Curl error: unable to use client certificate (no key found or wrong pass phrase?)

    What can i possibly do wrong? The passphrase IS the word pass .

    I created my .crt by doing :

    openssl req -config openssl.cnf -new -out ipm.csr -keyout ipm.pem
    
    openssl rsa -in ipm.pem -out ipm.key
    
    openssl x509 -in ipm.csr -out ipm.crt -req -signkey ipm.key -days 365
    

    I don't want to put the SSL_VERIFYPEER and SSL_VERIFYHOST to false.