私は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オプションはありますか?
SNIを使用できるようにするには、3つの条件が必要です。
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
を強制的に実行することができます。
必要なライブラリとCurlバージョンに加えて、リクエストはresolveを使用してSNIをcurlで送信する必要があります。
curl -vik --resolve example.com:443:198.18.110.10 https://example.com/