php - SSL3_GET_SERVER_CERTIFICATE 证书在带有 IIS 的 Windows 10 Pro 上验证失败

标签 php iis phpmailer php-openssl

尝试通过 smtp.google.com 通过 PHPMailer 发送电子邮件时在 Windows 10 上由 IIS 托管的 PHP 上,我收到此错误消息:

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

我确定该错误的关键部分是证书验证失败。我正在运行 OpenSSL,它已启用并链接到我的 php.ini。这是我的本地 PHP 实例输出的一些信息:

OpenSSL support => enabled
OpenSSL Library Version => OpenSSL 1.0.1p 9 Jul 2015
OpenSSL Header Version => OpenSSL 1.0.1p 9 Jul 2015

Directive => Local Value => Master Value
openssl.cafile => no value => no value
openssl.capath => no value => no value

这是我的 PHP 代码:

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'src/Exception.php';
require 'src/PHPMailer.php';
require 'src/SMTP.php';

$mail = new PHPMailer;
$mail->isSMTP(); 
$mail->SMTPDebug = 2; // 0 = off (for production use) - 1 = client messages - 2 = client and server messages
$mail->Host = "smtp.gmail.com"; // use $mail->Host = gethostbyname('smtp.gmail.com'); // if your network does not support SMTP over IPv6
$mail->Port = 587; // TLS only
$mail->SMTPSecure = 'tls'; // ssl is depracated
$mail->SMTPAuth = true;
$mail->Username = $smtpUsername;
$mail->Password = $smtpPassword;
$mail->setFrom($emailFrom, $emailFromName);
$mail->addAddress($emailTo, $emailToName);
$mail->Subject = 'PHPMailer GMail SMTP test';
$mail->msgHTML("test body"); //$mail->msgHTML(file_get_contents('contents.html'), __DIR__); //Read an HTML message body from an external file, convert referenced images to embedded,
$mail->AltBody = 'HTML messaging not supported';
// $mail->addAttachment('images/phpmailer_mini.png'); //Attach an image file

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

关于 OpenSSL 和证书问题,我无法理解。我试图理解 PHPMailer troubleshooting guide更新 CA 证书部分,但我迷路了,很困惑。有人可以给我一组我可以遵循的步骤并解决我本地 Windows 10 机器上的证书问题吗?

最佳答案

要解释指南,请下载 the CA bundle from curl并将其存储在文件系统的某个位置。采用您保存它的路径并在您的 php.ini 文件中添加一行:

openssl.cafile = $path

$path 是您保存 CA 证书的位置。然后重新启动您的 Web 服务器以获取 ini 更改。

如果有效,您应该在 phpinfo() 的输出中看到该设置,并且它还应该为 PHP 提供在 PHPMailer 使用证书时验证证书所需的内容。请注意,如果服务器提供的证书确实无效或过期,这将无济于事,但考虑到这是一个众所周知的问题和解决方案,我希望它能奏效。

关于php - SSL3_GET_SERVER_CERTIFICATE 证书在带有 IIS 的 Windows 10 Pro 上验证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48129318/

相关文章:

php - 找不到驱动程序 sqlsrv PHP 8.0.1

iis - 如何使用基本身份验证将比用户名/密码更多的数据传递给 WCF 4.0 RESTful 服务中的服务方法

c# - 引用 5MB .Net 程序集是否有任何性能注意事项?

php - 对发件人电子邮件地址进行硬编码是否可以避免昨天宣布的 PHPMailer 漏洞?

smtp - phpmailer 和 gmail SMTP 错误 : Failed to connect to server: Network is unreachable (101) SMTP connect() failed

php - 元素位置的最佳数据库插入查询

php - 仅使用 PHP echo 语句编写 HTML 标记是一种不好的做法吗?

php - 简单的mailto集成查询

javascript - 如何获得真正的 UTC 时间戳(独立于客户端)?

PhpMailer 不发送邮件 - TLS 错误?