3

API に対して行う約 2 秒おきのリクエストで、このエラーが発生します!?

API のバックエンドは、自己署名 SSL 証明書でセットアップした自分のサーバーの 1 つです。

ここで何が起きてるの!?場合によっては機能するため、SSL証明書にすることはできません

Warning:  fsockopen(): SSL operation failed with code 1. OpenSSL Error messages:
error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure in

API リクエスト コード

$Request = new Request();
$Request->host = $host;
$Request->api_secret = 'asdf39Sf3D';
$Request->send($url, $params);
echo $Request->get_result();

class Request {
    public $host;
    public $api_secret;

    public $boundary;
    public $body;

    private $response;
    private $url;

    const SSL = true;

    public function send($url, $post_vars=array()){
        $this->url = $url;

        $crlf = "\r\n";

        $host = $this->host;
        $port = 80;

        if(self::SSL){
            $host = 'ssl://'.$this->host;
            $port = 443;
        }

        if($this->body){
            $body = $this->body;
        }
        else{
            $post_vars['__api_hash'] = $this->generate_hash($this->url);
            $body = http_build_query($post_vars);
        }

        $content_length = strlen($body);

        $max_post = 1024 * 1024 * 20;
        if($content_length > $max_post){
            throw new Exception("Max post size exceeded");
        }

        if($fp = fsockopen($host, $port, $errno, $errstr, 20)){
            fwrite($fp, 'POST '.substr($this->url, strlen($this->host)).' HTTP/1.1'.$crlf
                .'Host: '.$this->host.$crlf
                .($this->body ? 'Content-type: multipart/form-data; boundary='.$this->boundary : 'Content-Type: application/x-www-form-urlencoded').$crlf
                .'Content-Length: '.$content_length.$crlf
                .'Connection: Close'.$crlf.$crlf
                .$body);

            while($line = fgets($fp)){
                if($line !== false){
                    $this->response .= $line;
                }
            }

            fclose($fp);
        }
        else{
            throw new Exception("$errstr ($errno)");
        }
    }

    public function get_response(){
        return $this->response;
    }

    public function get_result(){
        list($header, $content) = explode("\n\n", str_replace("\r\n", "\n", $this->response));

        preg_match('/^HTTP\/[\d\.]+ (\d+)/', $header, $matches);
        switch($matches[1]){
            case 404:
                throw new Exception('HTTP 404 '.$this->url);
        }

        return json_decode($content, true);
    }

    public function generate_hash(){
        return sha1($this->url.$this->api_secret);
    }
}
4

1 に答える 1

3

2009 年には、 SSL/TLS再ネゴシエーションの問題が広く公表されました。おそらく、安全でない再ネゴシエーションから保護するために追加されたコードの結果を見ているでしょう。安全でない再ネゴシエーションの問題を修正するために通信の片側にパッチが適用されている場合、これも表示されているエラーの原因となる可能性があります。両側には、SSL のパッチを適用したバージョン、またはパッチを適用していないバージョンが必要です。OpenSSLの変更ログから、少なくともv0.9.8m.

Wamp2 と "The ordinal 942 could not be found in the dynamic link library LIBEAY.dll"を見ると、 WAMPに同梱されている OpenSSL のバージョンが悪い可能性があります。

于 2013-11-06T15:31:32.597 に答える