如何修复SSL证书验证失败

2023-12-20

我在本地使用 PHPMailer、Apache 和 PHP。 当我测试我的 SSL 配置和我的 cacerts 时,我得到

default_cert_file = C:\Program Files\Common Files\SSL/cert.pem
default_cert_file_env = SSL_CERT_FILE
default_cert_dir = C:\Program Files\Common Files\SSL/certs
default_cert_dir_env = SSL_CERT_DIR
default_private_dir = C:\Program Files\Common Files\SSL/private
default_default_cert_area = C:\Program Files\Common Files\SSL
ini_cafile = 
ini_capath = 

然后,我做

 var_dump(fsockopen("smtp.gmail.com", 465, $errno, $errstr, 3.0));
 var_dump($errno);
 var_dump($errstr);

我得到

fsockopen resource(2) of type (stream) int(0) string(0) "" 

In my php.ini I have curl.cainfo = C:/php/cacert.pem in the curl部分并且它有效。

但是当我尝试使用 PHPMailer 从本地主机发送邮件时,我不断收到

SSL operation failed with code 1. OpenSSL Error messages:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed 
Failed to enable crypto
unable to connect to ssl://smtp.gmail.com:465 (Unknown error)

我还去了SMTP中使用的帐户,在https://accounts.google.com/DisplayUnlockCaptcha并启用它。并https://myaccount.google.com/lesssecureapps?pli=1并启用不太安全的应用程序。 我猜这是一个 SSL 错误,而不是 PHPMailer。坦白说,我很困惑,不知道如何解决。请原谅我的无知,任何关于出了什么问题以及如何解决它的帮助都会很棒。

PS,这是我发送邮件的 php 文件。谢谢

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;    
require 'C:/php/PHPMailer/src/Exception.php';
require 'C:/php/PHPMailer/src/PHPMailer.php';
require 'C:/php/PHPMailer/src/SMTP.php';

$mail = new PHPMailer(true);                             
try {

    $mail->SMTPDebug = 3;
    $mail->isSMTP();                                      
    $mail->Host = 'smtp.gmail.com'; 
    $mail->SMTPAuth = true;                               
    $mail->Username = '[email protected] /cdn-cgi/l/email-protection';                 
    $mail->Password = 'secret';                           
    $mail->SMTPSecure = 'ssl';                            
    $mail->Port = 465;                                    

    //Recipients
    $mail->setFrom('[email protected] /cdn-cgi/l/email-protection');
    $mail->addAddress('[email protected] /cdn-cgi/l/email-protection');     


    //Content
    $mail->isHTML(true);                                 
    $mail->Subject = 'subject';
    $mail->Body    = 'HTML message body <b>in bold!</b>';
    $mail->AltBody = 'body in plain text';

    $mail->send();
    echo 'Message has been sent';
} catch (Exception $e) {
    echo 'Message could not be sent.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
}            
?>

Update

当我尝试使用$mail->SMTPSecure = 'ssl'; and $mail->Port = 465; I get

2017-10-01 13:04:25 Connection: opening to ssl://smtp.gmail.com:465, timeout=300, options=array()
2017-10-01 13:04:26 Connection failed. Error #2: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed [C:\php\PHPMailer\src\SMTP.php line 324]
2017-10-01 13:04:26 Connection failed. Error #2: stream_socket_client(): Failed to enable crypto [C:\php\PHPMailer\src\SMTP.php line 324]
2017-10-01 13:04:26 Connection failed. Error #2: stream_socket_client(): unable to connect to ssl://smtp.gmail.com:465 (Unknown error) [C:\php\PHPMailer\src\SMTP.php line 324]
2017-10-01 13:04:26 SMTP ERROR: Failed to connect to server: (0)
SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
Message could not be sent.Mailer Error: SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

当我尝试使用$mail->SMTPSecure = 'tls'; and $mail->Port = 587; I get

2017-10-01 13:07:20 Connection: opening to smtp.gmail.com:587, timeout=300, options=array()
2017-10-01 13:07:21 Connection: opened
2017-10-01 13:07:21 SERVER -> CLIENT: 220 smtp.gmail.com ESMTP l4sm5217189wrb.74 - gsmtp
2017-10-01 13:07:21 CLIENT -> SERVER: EHLO localhost
2017-10-01 13:07:21 SERVER -> CLIENT: 250-smtp.gmail.com at your service, [85.75.196.114]250-SIZE 35882577250-8BITMIME250-STARTTLS250-ENHANCEDSTATUSCODES250-PIPELINING250 SMTPUTF8
2017-10-01 13:07:21 CLIENT -> SERVER: STARTTLS
2017-10-01 13:07:21 SERVER -> CLIENT: 220 2.0.0 Ready to start TLS
2017-10-01 13:07:21 Connection failed. Error #2: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed [C:\php\PHPMailer\src\SMTP.php line 403]
SMTP Error: Could not connect to SMTP host.
2017-10-01 13:07:21 CLIENT -> SERVER: QUIT
2017-10-01 13:07:21 SERVER -> CLIENT: 
2017-10-01 13:07:21 SMTP ERROR: QUIT command failed: 
2017-10-01 13:07:21 Connection: closed
SMTP Error: Could not connect to SMTP host.
Message could not be sent.Mailer Error: SMTP Error: Could not connect to SMTP host.

刚刚有相同的错误消息,也许您遇到了相同的问题:

  • 我的证书很好(我可以毫无问题地访问 HTTPS 域)
  • 无法通过 PHP 运行相同的请求stream_context_create and stream_socket_client
  • 我想要检查 SSL 证书

通过 cURL 测试相同的域返回:

curl: (60) SSL certificate problem: certificate is not yet valid

结果我运行 PHP 和 cURL 的虚拟机出现了 11 天的错误(12 月 11 日而不是 12 月 22 日)。

通过修复计算机/虚拟机的日期 (using ntp, ntpdate-debian等),证书测试现在在 cURL 命令行或 PHP 中运行良好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何修复SSL证书验证失败 的相关文章

  • 从 PHP SoapServer 返回 PHP 数组

    我对 Soap 的 创建服务端 还比较陌生 所以提前对我正在思考的任何术语表示歉意 是否可以从使用 PHP 的 SoapServer 类设置的远程过程 Soap 服务返回 PHP 数组 我有一个 WSDL 通过盲目遵循教程构建 部分看起来像
  • 我应该存储密码的哈希值吗?

    用户系统和密码 我正在查看 MD5 内容 我想知道密码的正常 良好做法是什么 现在 我认为人们对密码进行超级加密并存储哈希值 如果是这样 密码检查如何工作 我只是让输入的密码再次经过加密过程 然后用存储的哈希值检查哈希值 对吗 这个问题可能
  • 使用服务定位器为 PHP Storm 提供更快、更好、更高效的类型提示

    几个月来我一直在寻找一种方法来做到这一点 我是喜欢自动完成的开发人员之一 对于 zend Framework 2 中的每个服务定位器调用 我输入以下提示 没有全局提示文件 var Module Service SuperService su
  • Laravel 异常队列最大尝试次数超出

    我创建了一个应用程序来向多个用户发送电子邮件 但在处理大量收件人时遇到问题 该错误出现在failed jobs table Illuminate Queue MaxAttemptsExceededException App Jobs ESe
  • SSL 速度:128 位与 256 位

    我决定使用 SSL 加密我的整个网站 即使实际上只有部分网站是必要的 最终结果是该网站现在有点慢 所以 我的问题是 我是否应该只加密网站的会员部分 请记住我在首页上有登录表单 我是否应该将加密降低到 128 位 如果站点总体较小 速度差异是
  • PHP - 从动态添加的 html 表格行获取输入

    我在这里设置了以下小提琴Fiddle https jsfiddle net fqugd7vL 7 如您所见 我可以通过单击 添加行 按钮来添加输入 添加的所有输入都有唯一的 ID 和名称 问题是 我不能只做类似的事情 actionInput
  • 使用 php 和 mysql 计算日期差(以小时为单位)

    我如何使用 php 和 mysql 找到以小时为单位的日期差异 Use TIMEDIFF http dev mysql com doc refman 5 1 en date and time functions html function
  • 如何在 WordPress 中设置发布日期的格式?

    我有一个侧边栏 我想在其中显示最新的帖子 现在它显示标题 日期和摘录 日期显示了我想要删除的时间 我用这个显示日期 recent post date
  • md5() 是做什么用的?

    我正在阅读本教程简单的PHP登录系统 http www phpeasystep com workshopview php id 6 最后它建议你应该使用 md5 加密您的密码 http www phpeasystep com worksho
  • PHP diff() 给出不正确的值,其中 $date1 = '2016-03-01'

    我使用下面的代码来确定一年内的员工服务 datePay1 new DateTime date1 datePay2 new DateTime date2 interval datePay1 gt diff datePay2 vYears in
  • PDO获取最后插入的ID

    我有一个查询 我想获取插入的最后一个 ID 字段ID是主键并且自动递增 我知道我必须使用这个声明 LAST INSERT ID 该语句适用于如下查询 query INSERT INTO cell place ID VALUES LAST I
  • angularjs - 将对象数组(JSON 数据)发布到 PHP 页面

    我的 JSON 数据的示例如下 scope a email keval gmail permissions upload 1 edit 1 email new aa permissions upload 1 edit 1 我想发布同样的内容
  • PHP 是否有可重用的路由器/调度程序?

    我正在使用一个简单的框架 它根据查询参数处理请求 http example com index php event listPage http example com index php event itemView id 1234 我想将
  • Elasticsearch 无法获取颁发者证书

    我正在尝试使用 LetsEncrypt 加密 tls 证书 但我的服务器页面显示 Kibana server is not ready yet 这是错误 etc kibana kibana yml type log timestamp 20
  • 回显并打印声明

    假设有以下代码
  • Magento - 无法重新索引产品价格 - 外键约束失败

    我最近刚刚将我的 magento 商店从 1 4 2 升级到 1 7 0 2 升级进行得很顺利 但是当我尝试在升级后重新索引数据时 产品价格失败了 我尝试过使用php shell indexer php reindexall来自 SSH 它
  • Twitter API 响应并不总是按预期返回实体媒体

    考虑使用以下命令检索 Twitter 用户的收藏夹列表 abraham twitteroauth PHP 库 https github com abraham twitteroauth https api twitter com 1 1 f
  • 按正确的顺序在字符串数组中查找常见字符

    我花了几天时间研究一个函数 以正确的顺序获取字符串数组中的常见字符 以创建通配符 这是一个解释我的问题的例子 我做了大约3个函数 但是当每个字母的绝对位置不同时 我总是遇到一个错误 我们假设 是 通配符 Array 0 gt 48ca135
  • 多维数组将每个列表数组存储在另一个数组中

    我嵌套了可能有 2 或 3 层深度的多维数组 在它里面我可能有也可能没有列表数组 我需要循环数组 Array 0 gt Array id gt 1 name gt cat name 1 list gt Array 1 gt swgdgbdg
  • 将 .p12 证书存储在钥匙串中以供稍后使用

    我正在尝试按照 Apple 文档处理此处的客户端 p12 证书 https developer apple com library ios documentation Security Conceptual CertKeyTrustProg

随机推荐

  • 使用“hasBackground”进行 Espresso 测试

    如何使用布局背景的颜色进行浓缩咖啡测试 目前使用有背景 https developer android com reference android support test espresso matcher ViewMatchers htm
  • JSON.parse() 不起作用

    我的服务器有一个 json canApprove true hasDisplayed false 我可以像这样解析 json var msg JSON parse canApprove true hasDisplayed false ale
  • 如何在C中定义函数指针数组

    我有一个小问题 我正在尝试动态定义函数指针数组calloc 但我不知道如何写语法 多谢 函数指针的类型就像函数声明一样 但用 代替函数名 所以一个指向 int foo int 将会 int int 为了命名该类型的实例 请将名称放在星号后面
  • 如何从对象的数组记录集中获取嵌套的 HTML 列表?

    我有一个由 SQL 查询返回的对象数组 其中 top id 是我的父 ID 字段 Array 0 gt stdClass Object id gt 1 top id gt 0 name gt Cat 1 1 gt stdClass Obje
  • 如何确定最接近的纵横比

    给定一个矩形形状 S 长宽比为 sx sy 以及另外两个矩形形状 A 长宽比为 ax ay 和 B 长宽比为 bx by 我如何找出形状 A 或 B 中哪一个具有最接近 S 的长宽比 形状的大小并不重要 是 sx sy ax ay 和 sx
  • 获取数据库表中的数据,如果不存在则将其插入,否则返回行 ID

    我有一个包含 date file creation 列的表文件 我想创建一个包含日期文件创建的表日期 当我插入新文件时 我检查表日期是否存在 我返回行 ID 并将其作为外部插入键在表文件中 否则我插入一个新日期并获取其新行 ID 以将其插入
  • 页面中的 Nuxtjs 异步等待在页面刷新时不起作用

    我尝试使用 vuex 和 nuxt js 在页面的 fetch 方法中获取数据 但是每当有人刷新页面时 它都会失败 但当我通过 nuxt 导航导航时 它会工作 所以在我的页面中我有 fetch store params store disp
  • 添加一列排名

    我有一些数据 test lt data frame A c aaabbb aaaabb aaaabb aaaaab bbbaaa 等等 所有元素的长度都相同 并且在我获取它们之前就已经排序了 我需要创建一个新的排名列 第一 第二 第三 之后
  • 删除 R 输出中的反引号

    我有某些变量lm在 R 中自动用反引号 反引号换行 例如名称中带有冒号的变量 经过一些处理后 我尝试用以下方法写出线性模型的变量和系数write table 不幸的是 反引号也被写出来了 如何防止这些反引号被写入 举一个简单但不切实际的例子
  • C# 调用 ActiveDirectory 的 SetPassword 函数的问题

    我成功创建了一个新用户 然后尝试使用以下代码设置其初始密码 newUser AuthenticationType AuthenticationTypes Secure newUser Invoke SetPassword new objec
  • DCG和左递归

    我正在尝试实现一个 dcg 它采用一组 a b c d 形式的字符串 我遇到的问题是 如果我有一个 s a c b 它返回 true 这是正确的答案 但是当我有 s a c f 形式的查询时 它不会返回答案 并且会耗尽本地堆栈 s gt s
  • ftp_get 不适用于大文件

    这是我的代码 con ftp connect ftpserver com ftp login con username password ftp pasv con true ftp set option con FTP TIMEOUT SE
  • create-react-app 不会生成 public 和 src 文件夹,因此无法启动

    我已经安装 CRA 一个多月了 并且一直在使用它 没有任何问题 但是今天我创建了一个新的 React 应用程序 它构建了文件夹和目录 但它不生成 src 和公共文件夹 它只是生成节点 module 文件夹 因此当我运行 npm start
  • Cordova/phonegap 活动生命周期

    我正在cordova应用程序中为android开发一个地图插件 让我们暂时忘记已经有不止一个了 并认为这是一个学术问题 的文档MapView states http developer android com reference com g
  • PhoneGap/Cordova iOS:捕获有持续时间限制的视频(即 30 秒)

    我想将视频捕捉时间限制为 30 秒 截至目前 PhoneGap 文档说明了 iOS 实现的以下内容 不支持持续时间参数 无法以编程方式限制录制长度 我确实找到了这篇文章 它似乎给出了纯粹客观的 C 实现的解决方案 iPhone 5秒视频拍摄
  • os_signpost 在模拟器上有效,但在设备上运行时无效

    我想使用仪器跟踪时间的函数之一中有以下代码行 当我从仪器在模拟器上运行该应用程序时 使用 os signpost 测量的时间确实显示出来 我可以准确地测量我需要的东西 Then I switch to device same code Ho
  • R - 分割数据框并保存到不同的文件

    我有一个数据框 其中包含多个地点的每月温度数据 gt df4 1 36 location variable cut month year freq 1 Adamantina temperature 10 Jan 1981 21 0 646
  • 如何消除 SSIS 作业中的“未使用的输出列”警告?

    我正在尝试消除 SSIS 进度日志中的一些虚假警告 我收到一堆关于使用原始 SQL 完成工作的任务中未使用列的警告 我有一个数据流 负责在加载新数据之前将数据归档到临时表中 数据流如下所示 OLEDB Source task read st
  • Xcode 是否隐式将 plist 转换为二进制格式?

    Xcode 在构建过程中是否会隐式地将项目中的 plist 转换为二进制文件 我不认为它隐式地这样做 但很难确定 有一个名为 Property List Output Encoding 又名 PLIST FILE OUTPUT FORMAT
  • 如何修复SSL证书验证失败

    我在本地使用 PHPMailer Apache 和 PHP 当我测试我的 SSL 配置和我的 cacerts 时 我得到 default cert file C Program Files Common Files SSL cert pem