升级到PHP5.6后,我试图通过fsockopen()连接到服务器时出错。
服务器(主机)上的证书是自签名的。
PHP警告: fsockopen():SSL操作失败,代码1。OpenSSL错误消息:OpenSSL:14090086:SSL验证失败
代码
if($fp = fsockopen($host, $port, $errno, $errstr, 20)){
$this->request = 'POST '.substr($this->url, strlen($this->host)).' HTTP/1.1'.$crlf
.'Host: '.$this->host.$crlf
.'Content-Length: '.$content_length.$crlf
.'Connection: Close'.$crlf.$crlf
.$body;
fwrite($fp, $this->request);
while($line = fgets($fp)){
if($line !== false){
$this->response .= $line;
}
}
fclose($fp);
}试过
# cd /etc/ssl/certs/
# wget http://curl.haxx.se/ca/cacert.pemphp.ini
openssl.cafile = "/etc/ssl/certs/cacert.pem"但是脚本仍然无法工作。
更新
这行得通
echo file_get_contents("/etc/ssl/certs/cacert.pem");更新2
$contextOptions = array(
'ssl' => array(
'verify_peer' => true, // You could skip all of the trouble by changing this to false, but it's WAY uncool for security reasons.
'cafile' => '/etc/ssl/certs/cacert.pem',
//'CN_match' => 'example.com', // Change this to your certificates Common Name (or just comment this line out if not needed)
'ciphers' => 'HIGH:!SSLv2:!SSLv3',
'disable_compression' => true,
)
);
$context = stream_context_create($contextOptions);
$fp = stream_socket_client("{$host}:{$port}", $errno, $errstr, 20, STREAM_CLIENT_CONNECT, $context);错误
routines:SSL3_GET_SERVER_CERTIFICATE:certificate警告: stream_socket_client():SSL操作失败,代码1。OpenSSL错误消息:错误:14090086:SSL OpenSSL验证失败
发布于 2015-09-03 02:57:00
您下载的文件(http://curl.haxx.se/ca/cacert.pem)是来自主要受信任证书颁发机构的根证书的包。您说远程主机有一个自签名的SSL证书,所以它不使用受信任的证书。openssl.cafile设置需要指向用于在远程主机上签名SSL证书的CA证书。PHP5.6已经比以前版本的PHP做了改进,现在默认情况下可以验证对等证书和主机名(http://php.net/manual/en/migration56.openssl.php)
您需要找到在对SSL证书进行签名的服务器上生成的CA证书,并将其复制到此服务器。如果使用的是自签名证书,则需要将用于对远程主机的SSL证书进行签名的CA证书添加到要从OR连接的服务器上的可信存储区,或者使用流上下文对每个请求使用该证书。将其添加到受信任的证书是最简单的解决方案。只需将远程主机的CA证书的内容添加到您下载的cacert.pem文件的末尾即可。
前任:
fsockopen不支持流上下文,所以使用stream_socket_client代替。它返回一个可以与fsockopen资源可以使用的所有命令一起使用的资源。
这应该是对您问题中的片段的替换:
<?php
$contextOptions = array(
'ssl' => array(
'verify_peer' => true, // You could skip all of the trouble by changing this to false, but it's WAY uncool for security reasons.
'cafile' => '/etc/ssl/certs/cacert.pem',
'CN_match' => 'example.com', // Change this to your certificates Common Name (or just comment this line out if not needed)
'ciphers' => 'HIGH:!SSLv2:!SSLv3',
'disable_compression' => true,
)
);
$context = stream_context_create($contextOptions);
$fp = stream_socket_client("tcp://{$host}:{$port}", $errno, $errstr, 20, STREAM_CLIENT_CONNECT, $context);
if (!$fp) {
echo "$errstr ({$errno})<br />\n";
}else{
$this->request = 'POST '.substr($this->url, strlen($this->host)).' HTTP/1.1'.$crlf
.'Host: '.$this->host.$crlf
.'Content-Length: '.$content_length.$crlf
.'Connection: Close'.$crlf.$crlf
.$body;
fwrite($fp, $this->request);
while (!feof($fp)) {
$this->response .= fgets($fp);
}
fclose($fp);
}发布于 2016-07-12 14:37:09
通过使用Docker,我在Ubuntu16.04的工作中遇到了类似的问题。在我的例子中,这是Composer的一个问题,但是错误消息(因此问题)是一样的。
由于极简主义的码头导向的基本形象,我错过了ca-certificates包和简单的apt-get install ca-certificates帮助我。
发布于 2016-11-13 18:20:08
添加
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
));在此之前
mail->send()并替换
require "mailer/class.phpmailer.php";使用
require "mailer/PHPMailerAutoload.php";https://stackoverflow.com/questions/32211301
复制相似问题