2017-05-23 11 views
0

Let's Encrypt証明書付きのPHPMailerを使用して電子メールを送信しようとしていますが、PHP 5.6に移行した後、ドメイン検証に失敗したため動作しません。TLS経由でメールを送信するためのPHPMailerでのPHP 5.6の問題

Connection failed. Error #2: stream_socket_enable_crypto(): SSL operation >failed with code 1. OpenSSL Error messages:error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed

このため明白な問題を回避するには、ドメインの確認を無効にすることですが、私は、これは以下の

php -r "var_dump(openssl_get_cert_locations());" 

array(8) { 
    ["default_cert_file"]=> 
    string(36) "/usr/local/apps/etc/openssl/cert.pem" 
    ["default_cert_file_env"]=> 
    string(13) "SSL_CERT_FILE" 
    ["default_cert_dir"]=> 
    string(33) "/usr/local/apps/etc/openssl/certs" 
    ["default_cert_dir_env"]=> 
    string(12) "SSL_CERT_DIR" 
    ["default_private_dir"]=> 
    string(35) "/usr/local/apps/etc/openssl/private" 
    ["default_default_cert_area"]=> 
    string(27) "/usr/local/apps/etc/openssl" 
    ["ini_cafile"]=> 
    string(0) "" 
    ["ini_capath"]=> 
    string(0) "" 
} 

出力をどのように動作するかを知ってほしいと私は同じことを行うことを望んでいませんよ

上記の場所にcert.pemがありますが、私の証明書と秘密鍵は、/etc/sslにあります。、私はそれらのフォルダにSysmlinkを作成しようとしましたが、まだ検証は失敗します。

ドメイン検証を無効にするという解決策のほとんどが問題を抱えているにもかかわらず、同じことがわからなくても、どのように検証が機能するのか誰でも説明できます。

証明書に関連するすべての適切なファイルがあり、私のウェブサイトで使用しているので、有効な証明書であるため、何か不足しています。ここで

はphpmailerののコード

require 'PHPMailer-master/PHPMailerAutoload.php'; 
$mail = new PHPMailer; 
$mail->isSMTP(); 
$mail->SMTPDebug = 5; 
$mail->Debugoutput = 'html'; 
$mail->Host = 'mydomin.com'; 
$mail->Port = 587; 
$mail->SMTPSecure = 'tls'; 
$mail->SMTPAuth = true; 
$mail->Username = "[email protected]"; 
$mail->Password = "test"; 
$mail->setFrom('[email protected]', 'Hii'); 
$mail->addAddress('[email protected]', 'John Doe'); 
$mail->Subject = 'PHPMailer GMail SMTP test'; 
$mail->msgHTML("<h2>Hello World</h2>"); 
$mail->AltBody = 'This is a plain-text message body'; 

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

if (!$mail->send()) { 
    echo "Mailer Error: " . $mail->ErrorInfo; 
} else { 
    echo "Message sent!"; 
} 
+0

確かにあなたは確かに**検証を無効にしてはいけませんが、あなたは少し混乱しています。独自の* mail *サーバーを使用している場合、Webサーバーと同じ証明書を使用するようにアクセスし、構成する必要があります.PHPの設定とは何の関係もありません。 'SMTPDebug = 3'を設定することをお勧めします。これはこれをデバッグするのに十分で、4+よりもノイズが少なく、PHPMailerのトラブルシューティングガイドで説明されているようにopensslを使って正しく設定されているかチェックできます。 – Synchro

+0

私は** Exim **に証明書を使用するように設定しているので、なぜ問題が発生するのか分からないようです。私はまた、コマンドラインを使用してチェックアウトし、out putは有効な証明書を表示します – Sachin

+0

opensslでチェックしてください。ほとんどの場合、名前の不一致または不明なCAのいずれかです。私はドメインを知らずにそれをチェックすることはできません。 – Synchro

答えて

0

サーバーには、その応答でのみ、リーフ証明書をletsencryptのX3中間証明書を提供していません。ですこれは、ほとんどのCAストアには、letencrypt CA証明書が含まれておらず、署名されているルート証明書だけが含まれているため、2つをブリッジする中間体が必要です。中間証明書をhereから取得し、証明書ファイルに追加します。

$ wget https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem.txt 
$ openssl s_client -CAfile lets-encrypt-x3-cross-signed.pem.txt -connect example.com:465 
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3 
verify return:1 
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3 
verify return:1 
depth=0 CN = example.com 
verify return:1 
--- 
Certificate chain 
0 s:/CN=example.com 
    i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3 
... 
Verify return code: 0 (ok) 

は、サーバー側でその証明書をバンドルした場合、それは地元の中間証明書なしで日付のクライアントにすべてに仕上げる必要があります。ここでは

を使用すると、クライアント側から作業それを見ることができる方法です。

+1

助けてくれてありがとう@Synchroそれはうまくいった – Sachin

関連する問題