web-dev-qa-db-ja.com

SNI(サーバー名表示)でcURLを使用する

私はcURLを使用して、SNIを使い始めたばかりのAPIに投稿しようとしています(1つのIPアドレスで複数のssl証明書をホストできるようにしています)。

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

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

このコードを使用すると、機能します。

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

ただし、SSL証明書を検証しないため、-kの使用は好ましくありません。

このコードを使用しても機能しません:

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

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

22
Justin

SNIを使用できるようにするには、3つの条件が必要です。

  • 変更ログ によると、少なくとも7.18.1をサポートするバージョンのCurlを使用します。
  • SNIをサポートするライブラリに対してコンパイルされたバージョンのCurlを使用します。 OpenSSL 0.9.8j(一部の古いバージョンのコンパイルオプションによって異なります)。
  • 少なくともTLS 1.0を使用している(SSLv3ではない)。

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

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

-1(TLS 1.0の場合)または-3(SSLv3の場合)なしでcurlを使用する場合、(コンパイルオプションによっては)デフォルトでどのSSL/TLSバージョンが使用されるかわかりません)、ただし、SSLv3では機能しないため、コマンドで-1を強制的に実行することができます。

47
Bruno

必要なライブラリとCurlバージョンに加えて、リクエストはresolveを使用してSNIをcurlで送信する必要があります。

curl -vik --resolve example.com:443:198.18.110.10 https://example.com/
11
hardik p