web-dev-qa-db-ja.com

PHP 5.6がSSL証明書の処理方法を変更したのはなぜですか?

PHPMailerを使用してSMTPでメールを送信していました。今回はPHP 5.6を使用しました。以下のエラーを受け取りました。

Warning: stream_socket_enable_crypto(): 
Peer certificate CN=`*.example1.com' did not match expected CN=`mail.example2.com'
in /usr/share/php/libphp-phpmailer/class.smtp.php on line 344

これを調査すると、私は this question になりました。これは、これを言うPHPMailerのドキュメントについて言及しています。

以前のバージョンからの変更点では、PHP 5.6はSSL接続で証明書を検証します。接続しているサーバーのSSL構成が正しくない場合、次のようなエラーが発生します。

それはこの回避策を提案しています:

$mail->SMTPOptions = array(
    'ssl' => array(
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
    )
);

しかし、それは言い続けます

...これはお勧めできません:これらの設定をphp.iniでグローバルに変更することもできますが、これは非常に悪い考えです。 PHP 5.6は非常に正当な理由でこの変更を行いました。

それらの非常に良い理由は何ですか?

1
Goose

PHP 5.6を使用すると、TLSを使用するためのデフォルトが最終的に変更され、デフォルトで証明書を検証し、適切に検証します(つまり、証明書チェーンだけでなくホスト名も)。ほぼ同時に、 Python(バージョン2.7.9)。

これらの変更は、証明書を適切にチェックしないと、接続が中間者攻撃に対して脆弱になるために行われました。しかし、証明書を適切にチェックする機能を追加するために開発者に依存することは機能しません。それも機能しないように見えるので、より安全にするために追加の作業を追加する理由です。つまり、デフォルトで有効になっている安全な動作を使用することが唯一の受け入れ可能なオプションです。さらに、PythonとPHPには、以前に証明書を適切にチェックする方法さえありませんでした。つまり、簡単な方法でできることは、証明書チェーンをチェックすることだけでした。ホスト名ではありません。

Snowden事件の後、多くのサイトがHTTPSに切り替わったときにこれらの変更が行われたこと、そしてこの事件の暴露が不適切に保護された接続のスニッフィングとハイジャックが理論的なものだけでなく、政府機関が実際に行ったことを示していたため、おそらく偶然ではないそれの使用。

4
Steffen Ullrich