2016-08-26 4 views
1

次のスクリプトは、PHP 5.6.23上で動作動作しません:のcURL:をCURLOPT_CAINFOが正しい証明書が含まれていますが

$options = [ 
    CURLOPT_POST => 1, 
    CURLOPT_URL => 'https://uat.dwolla.com/oauth/rest/offsitegateway/checkouts', 
    CURLOPT_RETURNTRANSFER => 1, 
    CURLOPT_POSTFIELDS => json_encode(['name'=>'value']), 
    CURLOPT_HTTPHEADER => ['Content-Type: application/json'], 
    CURLOPT_SSL_VERIFYPEER => true, 
    CURLOPT_CAINFO => '/path/to/certs/GoDaddyRootCertificateAuthority-G2.crt', 
]; 
$ch = curl_init(); 

curl_setopt_array($ch, $options); 
if(! $result = curl_exec($ch)) $err = curl_error($ch); 
else $err = null; 

curl_close($ch); 

if($err) echo $err; 
else print_r(json_decode($result,true)); 

私はDwollaの支払いAPIから予想される応答を取得します。私のスクリプトをよりダイナミックにするために、私はcURLを信頼させたいcertsをホストするディレクトリを参照するように変更しようとしました。しかしこれは、スクリプトを分割し、何も接続が行われていない

CURLOPT_CAPATH => '/path/to/certs' 

;:だから私はに最後のオプション(CURLOPT_CAINFO)に変更しましたエラーは次のとおりです。

SSL証明書問題:ローカル発行者証明書に

を取得することができない私は、ディレクトリが正しいことを知っていて、元のスクリプトが同じディレクトリに証明書を参照するため、証明書ファイルが有効です。 cURLは、ディレクトリ内のファイルをスキャンし、必要な証明書を見つけることを期待しましたが、これは起こっていません。どうしてこれなの?

+0

'crt'の名前を' test.crt'に変更してもう一度やり直してください。 – Hackerman

+0

@Hackermanは違いはありませんでした。それは最初の方法( 'CURLOPT_CAINFO'を用いて)で動作します。第2の方法と同じエラー( 'CURLOPT_CAPATH')。 – BeetleJuice

+0

これで試してみてください:https://certs.godaddy.com/repository/gdroot-g2.crt – Hackerman

答えて

1

CApathをいくつかのディレクトリにポイントして証明書をこのディレクトリに置くだけでは機能しません。正しいCA証明書が効率的に見つかるようにするには、このディレクトリ内のファイルに証明書の件名から派生した名前を付ける必要があります。たとえば、あなたは/etc/ssl/certsに次のように見つけるかもしれないよ:

ここ
ff783690.0 -> UTN_USERFirst_Hardware_Root_CA.pem 
    ff588423.0 -> ComSign_CA.pem 
    ... 

ファイル名は、実際の証明書への証明書のサブジェクトとポイントのハッシュに基づいています。必要なファイル名を作成する方法については、How to calculate the hash value used by CA file names を参照してください。

も参照してくださいman page for openssl verify

-capathディレクトリ
信頼された証明書のディレクトリ。証明書の名前はhash.0でなければなりません。また、このフォームのシンボリックリンクを持つ必要があります(「ハッシュ」はハッシュされた証明書サブジェクト名です:x509ユーティリティの-hashオプションを参照)。 Unixでは、c_rehashスクリプトは自動的に証明書のディレクトリへのシンボリックリンクを作成します。

関連する問題