web-dev-qa-db-fra.com

Passer des fichiers .pem et .key dans cURL ne fonctionne pas dans WordPress

Je construis un plugin de passerelle de paiement pour woocommerce qui nécessite l'envoi d'une requête XML via cURL, chiffré avec une clé privée.

J'utilise le code suivant:

$xml_request    ='<?xml version="1.0" encoding="utf-8"?>';

$test_URL       = 'https://my-gateway.com';
// Here is where I change the file paths
$certfile       = '/clientcert.pem';
$keyfile        = '/clientkey.key';

$ch = curl_init();

curl_setopt( $ch, CURLOPT_URL, $test_URL );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); 
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt( $ch, CURLOPT_SSLCERT, getcwd() . $certfile );
curl_setopt( $ch, CURLOPT_SSLKEY, getcwd() . $keyfile );
curl_setopt( $ch, CURLOPT_POST, 1 );
curl_setopt( $ch, CURLOPT_HTTPHEADER, array( 'Content-Type: text/xml' ) );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $xml_request );
$ch_result = curl_exec( $ch );


// Check for errors
if ( curl_errno($ch) ) {
    $ch_result = 'cURL ERROR -> ' . curl_errno($ch) . ': ' . curl_error($ch);
} else {
    $returnCode = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE);
    switch($returnCode){
        case 200:
            break;
        default:
            $ch_result = 'HTTP ERROR -> ' . $returnCode;
            break;
    }
}

curl_close( $ch );

echo $ch_result;

Le problème est que curl ne peut pas trouver le certificat ou les fichiers de clé, quel que soit le chemin que j'utilise. J'ai essayé des chemins absolus et relatifs.
J'ai changé les emplacements des fichiers .pem et .key (répertoire du thème essayé, répertoire du plugin et racine).
J'ai changé les permissions en full.

Mais j'ai toujours l'erreur
58: unable to use client certificate (no key found or wrong pass phrase?)

Ce qui signifie que le fichier n'est pas trouvé ou corrompu, alors que je suis sûr qu'il ne l'est pas, car lorsque je copie ce code dans un fichier php en dehors de WordPress et que je l'exécute, cela fonctionne .

Je peux résoudre ce problème en redirigeant l'utilisateur vers une page extérieure à WordPress, mais je préférerais que tout soit exécuté à partir du même endroit.
Comment cela peut-il être fait?

4
vegu

Basé sur le commentaire de @Mamaduka; les modifications suivantes le résolvent:

Utilisez plugin_dir_path() pour obtenir le chemin du répertoire du système de fichiers:

$certfile = plugin_dir_path(__FILE__) . '/clientcert.pem';
$keyfile = plugin_dir_path(__FILE__) . '/clientkey.key';

Ensuite, supprimez getcwd().

Si vous voulez l'utiliser dans votre thème, utilisez TEMPLATEPATH

Je tiens également à mentionner que l'utilisation des chemins suivants précédemment n'a pas travail:

WP_PLUGIN_URL . "/" . plugin_basename( dirname(__FILE__) ) . '/clientkey.key'

ni:

get_bloginfo('template_directory') . '/lib/cert/clientcert.pem'

ni:

'http://my-web-site.com/clientcert.pem'
1
vegu