PHP警告:stream_socket_enable_crypto():SSL操作失败,代码为1

时间:2017-09-26 11:42:57

标签: php wordpress ssl nginx

尝试使用PHPMailer配置和发送邮件时收到以下警告:

PHP Warning:  stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:
error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed

我已经查看了其他解决方案,但没有一个能够正常工作。以下是一些细节:

  1. 我的证书(来自letsencrypt)是有效的,至少在我的Nginx配置中是这样。我的WordPress网站安全无误地运行。我的PHP版本是7.0.xx

  2. 我已尝试将证书文件位置添加到php.ini,但它会警告无法加载流,即使地址是正确的。这是我尝试过的(其中包括):

    openssl.capath = "/etc/letsencrypt/live/example.org/"这导致了 与上面完全相同的错误。

    我也尝试过: openssl.cafile = "/etc/letsencrypt/live/example.org/fullchain.pem",但会收到警告:PHP Warning:failed loading cafile stream

  3. 我的PHP邮件程序配置(位于我的wordpress函数文件中)如下所示:

            $phpmailer->Host = 'mail.example.org';
            $phpmailer->SMTPAuth = true;
            $phpmailer->Port = 587;
            $phpmailer->Username = 'myadminaccount@example.org';
            $phpmailer->Password = 'mypassword';
            $phpmailer->SMTPSecure = "tls";
            $phpmailer->From = "myadminaccount@example.org";
            $phpmailer->FromName = "MY Admin Account";
    

    正如我所说,我在网站的其他地方尝试了各种解决方案,但没有一个能够正常运行。我感到困惑,因为我的本地证书(以及邮件服务器的证书)都是有效的。

    我真的不想像其他地方建议的那样关闭同行验证,但如果我必须,我想我会。

1 个答案:

答案 0 :(得分:1)

UGH解决方案相当简单,除了我上面写的内容之外。我正在使用一个开关盒来检查以确保我的服务器是正确的,如下所示:

switch ($_SERVER['HTTP_HOST']) {
        case 'https://example1.org':     
        // Set the hostname of the mail server
        $phpmailer->Host = 'mail.example1.org';

我需要省略https。所以改成它:

switch ($_SERVER['HTTP_HOST']) {
        case 'example1.org':     
        // Set the hostname of the mail server
        $phpmailer->Host = 'mail.example1.org'; 

让它工作!我觉得自己像个傻瓜,但我希望这有助于其他人。