首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSL错误SSL3_GET_SERVER_CERTIFICATE:certificate验证失败

SSL错误SSL3_GET_SERVER_CERTIFICATE:certificate验证失败
EN

Stack Overflow用户
提问于 2015-08-25 18:19:53
回答 10查看 206.6K关注 0票数 59

升级到PHP5.6后,我试图通过fsockopen()连接到服务器时出错。

服务器(主机)上的证书是自签名的。

PHP警告: fsockopen():SSL操作失败,代码1。OpenSSL错误消息:OpenSSL:14090086:SSL验证失败

代码

代码语言:javascript
复制
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);
}

试过

代码语言:javascript
复制
# cd /etc/ssl/certs/
# wget http://curl.haxx.se/ca/cacert.pem

php.ini

代码语言:javascript
复制
openssl.cafile = "/etc/ssl/certs/cacert.pem"

但是脚本仍然无法工作。

更新

这行得通

代码语言:javascript
复制
echo file_get_contents("/etc/ssl/certs/cacert.pem");

更新2

代码语言:javascript
复制
$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验证失败

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 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资源可以使用的所有命令一起使用的资源。

这应该是对您问题中的片段的替换:

代码语言:javascript
复制
<?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);

}
票数 35
EN

Stack Overflow用户

发布于 2016-07-12 14:37:09

通过使用Docker,我在Ubuntu16.04的工作中遇到了类似的问题。在我的例子中,这是Composer的一个问题,但是错误消息(因此问题)是一样的。

由于极简主义的码头导向的基本形象,我错过了ca-certificates包和简单的apt-get install ca-certificates帮助我。

票数 17
EN

Stack Overflow用户

发布于 2016-11-13 18:20:08

添加

代码语言:javascript
复制
$mail->SMTPOptions = array(
'ssl' => array(
    'verify_peer' => false,
    'verify_peer_name' => false,
    'allow_self_signed' => true
));

在此之前

代码语言:javascript
复制
mail->send()

并替换

代码语言:javascript
复制
require "mailer/class.phpmailer.php";

使用

代码语言:javascript
复制
require "mailer/PHPMailerAutoload.php";
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32211301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档