web-dev-qa-db-ja.com

GuzzleでTLS / SSLオプションを指定するにはどうすればよいですか?

PHPで、さまざまな異なるAPIを呼び出すコードでGuzzleを使用し始めています。その中には、TLSv1.2をサポートしていないものもあれば、TLSv1.2を必要とするものもあります。

認識されないことがわかっている場合を除いて、Guzzleに利用可能な最新のプロトコルを使用させるための最良の方法は何ですか?

12
MattC

シンプルで簡単です。

$client = new Client();
$guzzle = new GuzzleClient('https://www.yourweb.com', array(
    'curl.options' => array(
        CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2
    )
));
$client->setClient($guzzle);
...

Guzzle 3.0以降(@limosのコメントに従って更新):

'curl' => array(
    CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2
)

可能なCURLOPT_SSLVERSIONオプションは、公式のcURLページにあります。 http://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.html

---更新(コメントに基づく)---

適切なSSLプロトコルバージョンを選択するには、CURLOPT_SSLVERSION設定だけでなく、さらに多くのcURL設定が必要です。望ましい重要な結果は、「最大前方秘書」と呼ばれます。これはcURLだけでなく有効です!

複数のCURLOPT_SSLVERSIONパラメーターを使用することはできません(少なくとも、Guzzleのドキュメントでそのようなオプションは見つかりませんでした)。 CURLOPT_SSLVERSIONを定義すると、cURLはそのSSLバージョンの使用を試みます-cURLドキュメント(CURLOPT_SSLVERSIONについて上記で提供されたリンク)から-「使用を試みるSSL/TLSのバージョンを制御するためのlongasパラメーターを渡します。」

複数の安全な暗号を定義できますが、SSLバージョンパラメータは1つだけです。 TLS1.1より前のものは使用しません。以前のSSLバージョンは、攻撃に対して脆弱です。バージョンTLS1.1も脆弱ですが、そのルートを使用すると、1.2でクライアントの互換性の問題が発生する可能性があります。唯一の安全なもの(今のところ、脆弱性が見つかるまで)はTLS1.2です。

セキュリティを最優先する場合は、利用可能な最高のTLSバージョン(TLS1.2)を使用してください。サービスプロバイダーのセキュリティ責任がある場合、クライアントの互換性は問題ではありません。

セキュリティが重要な場合は、他のcURLオプションを確認してください。

適切なCURLOPT_SSL_VERIFYHOSTおよびCURLOPT_SSL_VERIFYPEERを設定すると、MITM攻撃を防ぐことができます。

CURLOPT_CAINFO-修正エラー:35-接続での不明なSSLプロトコルエラー。最大前方秘密を改善します。

調査するcURL暗号(CURLOPT_SSL_CIPHER_LIST)のリストを次に示します。これにより、最大転送秘密が向上します。

'DHE-RSA-AES256-SHA',
'DHE-DSS-AES256-SHA',
'AES256-SHA',
'ADH-AES256-SHA',
'KRB5-DES-CBC3-SHA',
'EDH-RSA-DES-CBC3-SHA',
'EDH-DSS-DES-CBC3-SHA',
'DHE-RSA-AES128-SHA',
'DHE-DSS-AES128-SHA',
'ADH-AES128-SHA',
'AES128-SHA',
'KRB5-DES-CBC-SHA',
'EDH-RSA-DES-CBC-SHA',
'EDH-DSS-DES-CBC-SHA:DES-CBC-SHA',
'EXP-KRB5-DES-CBC-SHA',
'EXP-EDH-RSA-DES-CBC-SHA',
'EXP-EDH-DSS-DES-CBC-SHA',
'EXP-DES-CBC-SHA'

これらの暗号は、強力なQualys SSL Labsリスト(2014)と照合され、脆弱な暗号は削除されました。暗号を自由に追加/削除してください。

それでも複数のCURLOPT_SSLVERSIONオプションを追求したい場合は、そのためのスクリプトを作成します(これは、良い習慣でも必要でもないと思います)。それでも、何らかの理由でその機能を追求することにした場合は、可能な限り強力なSSL暗号化を使用しようとするコードを記述し、接続に失敗した場合は次のバージョンにフォールバックします。

  1. 決定を下す前に、Qualys SSL Labsの projects セキュリティについて見てください。
  2. このSSL Labsの記事 完全転送秘密とベストプラクティスについて見てください。
  3. SSL LabsのWebツール を使用して、クライアント(Webブラウザー)の脆弱性をテストします。これにより、サーバーとアプリで何を確認し、何を改善して保護するかがわかります。
  4. QualysのSSLラボを使用してWebサイト/ Webサービスをテストします SSLツール

脆弱性と攻撃:Longjam、FREAK、POODLE、あなたはそれに名前を付けます!他にどのような攻撃や脆弱性が発見されていないか誰が知っていますか?はい!これらはすべて、SSL/TLS接続の選択に影響します。

クライアントを制御することはできませんが(開発しない限り)、サーバーおよびサーバーとクライアントのネゴシエーションを制御できます。

どのアプリを作成する場合でも、ニーズに応じて、ケースごとにベストプラクティスを検討し、次のオプションを決定する必要があります。

  1. セキュリティ
  2. 互換性
  3. 保守性
  4. 複雑

セキュリティが非常に重要な場合は、少なくともTLS1.1を使用してください。暗号リストも見てください、私はその部分を見落とさないでしょう。

これもいいですね 安全なレイヤーを作成するためのOWASPガイド アプリの周り。

OWASPとQualysSSL Labsは、最初から優れたリソースです。弱点、考えられるセキュリティオプション、およびベストプラクティスを理解するために、cURLとOpenSSLについて調査することもあります。

私が言及しておらず、欠落しているセキュリティポイントがありますが、すべてをカバーすることはできません。これは氷山の一角にすぎません。ここに記載されていないものはすべて、調査するためのものです。

幸運を!

可能であれば、私は質問に答えるために周りにいます。

9
GTodorov

Guzzle 5.3では、次の構文を使用する必要がありました。

$guzzle = new \GuzzleHttp\Client([
    'defaults' => [
        'config' => [
            'curl' => [
                CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2
            ]
        ]
    ]
]);
7
Ross Motley