web-dev-qa-db-ja.com

SSL証明書でPHP cURLを使用する際のエラー

ユーザー名とパスワードに加えて、SSL証明書を使用するページを通じてユーザーを認証できるcURLを使用して、PHPスクリプトを記述しようとしていますが、過去を通過することはできませんSSL証明書ステージ。

この場合、curl_setopt($handle, CURLOPT_VERIFYPEER, 0)は残念ながらオプションではありません。証明書は認証の必須部分です。それ以外の場合、 この他の同様のSO post に記載されているエラーが発生します。

私はcURLでいくつかのコマンドライン実行を試みました:

> curl --url https://website

これは、(60) SLL certificate problemエラーを返します。コマンドを調整して--cacertオプションを含める場合:

> curl --url https://website --cacert /path/to/servercert.cer

それはうまく機能します。認証Webサイトが返されます。

しかし、私は次のPHPコードを試しました:

$handle = curl_init();
$options = array( 
                  CURLOPT_RETURNTRANSFER => false,
                  CURLOPT_HEADER         => true,
                  CURLOPT_FOLLOWLOCATION => false,
                  CURLOPT_SSL_VERIFYHOST => '0',
                  CURLOPT_SSL_VERIFYPEER => '1',
                  CURLOPT_CAINFO         => '/path/to/servercert.cer',
                  CURLOPT_USERAGENT      => 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)',
                  CURLOPT_VERBOSE        => true,
                  CURLOPT_URL            => 'https://website'
           );

curl_setopt_array($handle, $options);
curl_exec($handle);
if (curl_errno($handle)) {
  echo 'Error: ' . curl_error($handle);
}
curl_close($handle);

コードは基本的にシェルコマンドに類似していると思っていましたが、代わりに次のエラーメッセージが表示されます。

エラー:証明書検証場所の設定エラー:CAfile:/path/to/servercert.cer CApath:なし

私は見つけることができるすべての文献を読みましたが(特にphp.netとcurl.haxxで)、この問題を修正するものを見つけることができないようです。助言がありますか?

編集chmod 777 servercert.cerを試しましたが成功しませんでした。ただし、ブラウザの代わりにphp test.phpを介してコマンドラインから上記のコードを使用してPHPスクリプトを実行すると、完全に機能します。ブラウザ?

編集2:この質問に答えるのに十分勇敢な唯一の魂に対するこれらのドライブバイダウンボートは古くなっています。何か有意義なものを提供するか、または渡します。

26
Magsol

物事はコマンドラインを介して動作しますが、curlを使用したphpを介しては動作しないため、curlが問題であることを追求します。

このURLによると、 http://curl.haxx.se/docs/sslcerts.html は、SO上記で引用した投稿(- CURL(php)を使用してSSLページを読み取る )...

「7.18.0まで、curlはデフォルトでインストールされた非常に古いcaバンドルファイルをバンドルしていました。最近では、curlアーカイブにはca証明書がまったく含まれていません。他の場所で取得する必要があります。

リモートサーバーが自己署名証明書を使用する場合、CA証明書バンドルをインストールしない場合、使用するバンドルに含まれていないCAによって署名された証明書をサーバーが使用する場合、またはリモートホストが詐欺師である場合お気に入りのサイトになりすまし、このサーバーからファイルを転送するには、次のいずれかを実行します。 "

次に、試行できるいくつかのステップをリストします。

Curlの7.16.3バージョンは7.18.0より前なので、まだお持ちでない場合は、curlおよびopensslコンポーネントを更新してから、上記のリストを確認することをお勧めします。

13
Night Owl

6年間の質問の後、共有ホストで同じ問題に遭遇しましたが、満足のいく答えはありません。私は自分で解決策を見つけました。それがすべての人に役立つことを願っています。

この設定を試すことができます:

curl_setopt($config,CURLOPT_SSL_VERIFYHOST,0);
curl_setopt($config,CURLOPT_SSL_VERIFYPEER,1);
curl_setopt($config,CURLOPT_CAINFO,'ca-bundle.crt');
curl_setopt($config,CURLOPT_CAPATH,'ca-bundle.crt');

@Magsolで同じエラーに遭遇しました:Error: error setting certificate verify locations: CAfile: /path/to/servercert.cer CApath: none;そこで、4行目を追加してCAPathを設定しました。

それは私と一緒に働いています。ただし、CAファイルはアクセス可能なディレクトリ(chmod 755または777を使用)に配置する必要があり、CAファイルが同じディレクトリにPHP file。

7
Davuz

これを詳しく説明して要約するには:

PHPファイルをPHP curlを使用して、システムのCA証明書を同じディレクトリに配置する場合、以下のコードはジャンプスタートを提供します

    $url = "https://myserver.mydomain.local/get_somedata.php";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);

//These next lines are for the magic "good cert confirmation"
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($ch, CURLOPT_VERBOSE, true);

//for local domains:
//you need to get the pem cert file for the root ca or intermediate CA that you signed all the domain certificates with so that PHP curl can use it...sorry batteries not included
//place the pem or crt ca certificate file in the same directory as the php file for this code to work
    curl_setopt($ch, CURLOPT_CAINFO, __DIR__.'/cafile.pem');
    curl_setopt($ch, CURLOPT_CAPATH, __DIR__.'/cafile.pem');

//DEBUG: remove slashes on the next line to prove "SSL verify" is the cause       
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

//Error handling and return result
    if (curl_exec($ch) === false)
      {
       $result = curl_error($ch);
      }
    else
      {
       $result = curl_exec($ch);
      }
    // Close handle
    curl_close($ch);
    return $result;
5
A-Train

この質問は非常に古いですが、現在回答を探している一部のユーザーにとっては役立つかもしれません。

SSLを使用するAPIについても同様の問題があり、ブラウザではなくCURLに問題があります。問題は、証明書を置くだけで、証明書チェーン/バンドルは入れないことです。それから私はそれを置き、物事は働き始めました。問題を回避するために重要です。

これが誰かに役立つことを願っています。

3