2012-10-17 1 views
17

SNIを使用し始めたばかりのAPIに投稿するためにcURLを使用しようとしています(1つのIPアドレスで複数のSSL証明書をホストできるようになりました)。SNI(サーバー名の表示)でcURLを使用する

このSNIへの移行の結果、私のcURLが機能しなくなりました。彼らは、cURLが* .domain-b.comの代わりに* .domain-a.comを取得してSSLが失敗するためだと説明しました。

ブラウザからアクセスしたときにAPI URLにエラーがないため、これはcURLのバグです。

このコードを使用して、それがない作品:それはSSL証明書を検証していないため、

exec('curl -k -d "parameters=here", https://urlhere.com/', $output); 
print_r($output); 

しかし、-kを使用して悪いです。このコードを使用して

、動作しません:

exec('curl -d "parameters=here", https://urlhere.com/', $output); 
print_r($output); 

だから私の質問は、私がSNIでカールを使用し、まだ(-k使用する必要はありません)SSLを確認することができますか、です。これを回避するために設定できるPHPまたはcURLオプションに別の設定がありますか?

答えて

44

は、SNIを使用できるようにするために、3つの条件が必要とされる:

  • それをサポートしているカールのバージョンを使用して、少なくとも7.18.1、change logsに記載の方法。
  • SNIをサポートするライブラリに対してコンパイルされたCurlのバージョンを使用します。 OpenSSL 0.9.8j(いくつかの古いバージョンのコンパイルオプションに依存)。
  • 少なくともTLS 1.0を使用する(SSLv3ではなく)。

カールのデバッグコード(-vが)のみ(主にssl_tls_traceを参照してください、メッセージのSSLv2のとのSSLv3 +タイプを区別するために)メジャーバージョン番号を表示しますので、あなたは、TLS 1.0以上を使用する場合、それはまだ「のSSLv3」を表示することに注意してください(効果的にSSL v3.1以上であるため、3は同じメジャーバージョン番号です)。

インストールされているバージョンのカールがWiresharkを使用してSNIを使用できることを確認できます。 curl -1 https://somethingを使用して接続する場合は、「クライアントハロー」メッセージを展開すると、「server_name」という拡張子が表示されます。

は、私はあなたがcurl-1なし(のSSLv3の場合)または-3(TLS 1.0)を使用する場合(あなたのコンパイルオプションに依存します)デフォルトで使用されているSSL/TLSバージョンわからないんだけど、あなたは-1を強制しようとすることができますとにかくSSLv3ではうまく動作しないため、あなたのコマンドには注意してください。

+0

libcurlを使いたい場合は、 'CURLOPT_SSLVERSION'を' 1'に設定します(コマンドラインでは '-1'と同じです)。 – Bruno

+0

私には、古いバージョンのcURLがインストールされていました。それを更新すると修正されました。 – Justin

+3

ところで、良い答えの良い例です。ありがとう –

関連する問題