Guooo - https
type: channel
link: http://icufree.com/tag/https/
items: PHP开启https后无法发送邮件问题

PHP开启https后无法发送邮件问题
type: item
date: 2018-09-18T15:14:00+08:00
description: 今天打开中国移动家的WIFI，然后进入我自己的科学小机场，发现里面！居然！出现了！广告！！首先我的网站是不可能投放广告的，（对，也没有人找我接广告），而服务器又是国外某大厂的，更不可能出现广告。所以只有一个情况，网络被某动运行商劫持了。于是我决定要给我的小机场加个小绿锁了。经过一通计算机基础操作，我把网站成功加上了https。于是我兴冲冲地把我的小网站拿去给朋友分享。然后朋友吐槽我邮件怎么那么慢，一分钟了都没发送成功我：？？？？我为了稳定性（懒）直接用的巨硬家的邮件服务，端口开放，我的服务器倒了巨硬的都不会，为什么会邮件发送失败？昨天还好好的...我第一时间测试了一遍，果然！发送失败了....然后我又在本地用相同配置测试了一遍，一切正常。我第一时间怀疑的就是https的锅。将 SMTP 的 debug level 调整到 2 后，出现了更多的报错信息：SSL routines:ssl3_get_server_certificate:certificate verify failed证书验证失败。我开始笃定跟https有关，又拿不出证据。万能的Google啊啊....啊...啊..好了，找到了。Google ：你PHP的OpenSSL扩展没开我 ：扯犊子呢，我开了。再说，没开扩展我昨天怎么发送出去的。Google : Emmmmmm......我：Emmmmm????Google：你的PHP找不到默认的根证书导致的这个问题，一般OpenSSL不会自带根证书，需要你自己搞一个放到根目录我：去哪搞？Google：这有一个神奇的链接：http://curl.haxx.se/ca/cacert.pem我：下好了，放哪？Google：放到PHP的根证书的目录啊我：？？？目录在哪？Google：....你执行这一段就知道了php -r "print_r(openssl_get_cert_locations());"我：返回这个东西：[root@vultr ~]# php -r "print_r(openssl_get_cert_locations());" Array ( [default_cert_file] => /usr/local/openssl/ssl/cert.pem [default_cert_file_env] => SSL_CERT_FILE [default_cert_dir] => /usr/local/openssl/ssl/certs [default_cert_dir_env] => SSL_CERT_DIR [default_private_dir] => /usr/local/openssl/ssl/private [default_default_cert_area] => /usr/local/openssl/ssl [ini_cafile] => /etc/pki/tls/certs/ca-bundle.crt [ini_capath] => )Google：看到那个default_cert_file了吗？把你下载的文件改成相同名字的cert.pem，然后放到default_cert_file对应的目录下就行了我：我都看不到ssl文件夹....Google：没有文件夹就新建一个，别那么多废话我：诶？真的有用！真棒！不枉我整天费劲去上你Google：......至此，邮件功能又恢复正常了。