web-dev-qa-db-ja.com

PHPMailer-SSL3_GET_SERVER_CERTIFICATE:証明書の検証に失敗しました

自己署名証明書を持つメールサーバーからメールを送信する必要があるという問題が発生しました。エラーは次のとおりです。

PHP Warning:  stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in class.smtp.php on line 327.

誰かが同様の何かに遭遇しましたか?

編集:

また、stream_context params(params: SSL context options )を設定しようとしました:

$options['ssl']['verify_peer'] = false;
$options['ssl']['verify_peer_name'] = false;
$options['ssl']['allow_self_signed'] = true;

運はありませんが、上記のエラーと同じエラーで失敗します。

ありがとう。

25
gor181

PHP 5.6ではSSL証明書の検証が導入されているため、設定が破損していると、このエラーで失敗します。 SSLを修正する必要がありますが、証明書を検証しないようにSMTPOptionsプロパティを設定することにより、以前の動作に戻すことができます。

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

ライブラリを編集すると、ライブラリのポイント全体が無効になります。Kafの答えが示すように変更すると、アップグレード時にコードが破損します。本当に、それをしないでください。

編集者注:SSL検証を無効にすると、セキュリティへの影響があります。SSL/HTTPS接続の信頼性を検証しないと、悪意のある攻撃者は信頼できるエンドポイント(GitHubや他のリモートGitホストなど)になりすますことができ、あなたは 中間者攻撃これを解決策として使用する前に、セキュリティの問題を完全に理解してください。

85
Synchro

私は同じ問題を抱えています。そこで、238行目のclass.smtp.phpファイルを変更しました。

public function connect($Host, $port = null, $timeout = 30, $options = array()) {
       if (count($options) == 0) {
           $options['ssl'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true);
       }

今では正常に動作します!

編集者注:SSL検証を無効にすると、セキュリティへの影響があります。SSL/HTTPS接続の信頼性を検証しないと、悪意のある攻撃者は信頼できるエンドポイント(GitHubや他のリモートGitホストなど)になりすますことができ、あなたは 中間者攻撃これを解決策として使用する前に、セキュリティの問題を完全に理解してください。

20
Kaf

同じ問題がありました。私のPostfix設定には中間体とルート証明書の設定が欠けていることがわかりました:

smtpd_tls_CAfile=/etc/ssl/certs/intermediate-root-bundle.crt

このPostfix構成はOutlookおよびThunderbirdで長年機能していましたが、PHPはより厳しく、SSLチェックに失敗しました。

したがって、PHPMailerをハッキングしたくなるかもしれませんが、しないでください。根本的な問題を修正してください。

2
SurfMan

私はKafのソリューションを試してそれが機能するまで何日も修正を探していたので、2セントを入れたかっただけです!ありがとう@Kaf

とにかく...私にとって、PHPMailerはPHPをPHP5.6にアップグレードすることを決定するまでは正常に動作していました。

PHP 5.6でSSLを開くために変更が行われました。公式ドキュメントは次のとおりです。

http://php.net/manual/en/migration56.openssl.php

ドキュメントから、verify_peerおよびverify_peer_namefalse

したがって、Kafの答えに従ってください。

編集者のメモ:また、この文書は推奨されていません! SSL検証を無効にすると、セキュリティに影響があります。SSL/HTTPS接続の信頼性を検証しないと、悪意のある攻撃者は信頼できるエンドポイント(GitHubや他のリモートGitホスト)、および Man-in-the-Middle攻撃 に対して脆弱になります。 これをソリューションとして使用する前に、セキュリティの問題を完全に理解してください。

0
alvinb