31

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 オプションの別の設定はありますか?

4

2 に答える 2

51

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

  • 変更ログによると、少なくとも 7.18.1 をサポートする Curl のバージョンを使用します。
  • SNI をサポートするライブラリに対してコンパイルされたバージョンの Curl を使用する。
  • 少なくとも TLS 1.0 を使用します (SSLv3 ではありません)。

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

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

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

于 2012-10-17T19:57:24.133 に答える