【问题标题】:Is it possible to read SSL information in PHP from any website?是否可以从任何网站读取 PHP 中的 SSL 信息?
【发布时间】:2011-03-28 16:56:24
【问题描述】:

我想知道是否可以使用 PHP 从其他方那里读取有关其 SSL 证书信息的信息,我已经尝试了很长时间,但没有找到适合我的真正答案。

例如,我在脚本中输入“www.paypal.com”,它会返回以下内容:

  • 授权机构:VeriSign, Inc
  • 有效期:2011 年 2 月 18 日 (18/02/11)
  • 类型:扩展验证
  • 主机:www.paypal.com
  • MD5: a8e7o7a8e9e9
  • SHA1:c2a4a1e4e3a2

而且,任何其他可能获得的东西。我想要 PHP 中的脚本。

【问题讨论】:

标签: php ssl curl ssl-certificate


【解决方案1】:
array("capture_peer_cert" => true))); $r = stream_socket_client("ssl://www.google.com:443", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $g); $cont = stream_context_get_params($r); print_r(openssl_x509_parse($cont["options"]["ssl"]["peer_certificate"])); ?>

【讨论】:

    【解决方案2】:

    我写了一个 PHP 类来获取 SSL 信息:

    class SSL {
    
        public $domain, $validFrom, $validTo, $issuer, $validity, $validitytot, $crtValRemaining;
    
        private static function instantiate($url, $info) {
            $obj = new static;
            $obj->domain = $url;
            $obj->validFrom = $info['validFrom'];
            $obj->validTo = $info['validTo'];
            $obj->issuer = $info['issuer'];
            $obj->validity = $info['validity'];
            $obj->validitytot = $info['validitytot'];
            $obj->crtValRemaining = $info['crtValRemaining'];
    
            return $obj;
        }
    
        public static function getSSLinfo($url) {
            $ssl_info = [];
            $certinfo = static::getCertificateDetails($url);
            $validFrom_time_t_m = static::dateFormatMonth($certinfo['validFrom_time_t']);
            $validTo_time_t_m = static::dateFormatMonth($certinfo['validTo_time_t']);
    
            $validFrom_time_t = static::dateFormat($certinfo['validFrom_time_t']);
            $validTo_time_t = static::dateFormat($certinfo['validTo_time_t']);
            $current_t = static::dateFormat(time());
    
            $ssl_info['validFrom'] = $validFrom_time_t_m;
            $ssl_info['validTo'] = $validTo_time_t_m;
            $ssl_info['issuer'] = $certinfo['issuer']['O'];
    
            $ssl_info['validity'] = static::diffDate($current_t, $validTo_time_t)." days";
            $ssl_info['validitytot'] = (static::diffDate($validFrom_time_t, $validTo_time_t)-1).' days';
    
            $ssl_info['crtValRemaining'] =$certinfo['validTo_time_t'];
    
            return static::instantiate($url, $ssl_info); // return an object
        }
    
        private static function getCertificateDetails($url) {
            $urlStr = strtolower(trim($url)); 
    
            $parsed = parse_url($urlStr);// add http://
            if (empty($parsed['scheme'])) {
                $urlStr = 'http://' . ltrim($urlStr, '/');
            }
            $orignal_parse = parse_url($urlStr, PHP_URL_HOST);
            $get = stream_context_create(array("ssl" => array("capture_peer_cert" => TRUE)));
            $read = stream_socket_client("ssl://".$orignal_parse.":443", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $get);
            $cert = stream_context_get_params($read);
            $certinfo = openssl_x509_parse($cert['options']['ssl']['peer_certificate']);
            return $certinfo;
        }
    
        private static function dateFormat($stamp) {
            return  strftime("%Y-%m-%d", $stamp);
        }
    
        private static function dateFormatMonth($stamp) {
            return  strftime("%Y-%b-%d", $stamp);
        }
    
        private static function diffDate($from, $to) {
            $date1=date_create($from);
            $date2=date_create($to);
            $diff=date_diff($date1,$date2);
            return ltrim($diff->format("%R%a"), "+");
        }
    
    }
    

    前:

    $certInfo = SSL::getSSLinfo('stackoverflow.com'); 
    echo $certInfo->validFrom .'<br>';
    echo $certInfo->validTo .'<br>';
    echo $certInfo->issuer .'<br>';
    echo $certInfo->validity .'<br>';
    echo $certInfo->validitytot .'<br>';
    echo $certInfo->crtValRemaining .'<br>';
    

    [确保您了解 SSL 类中的“实例化”方法]。谢谢...

    【讨论】:

    • 这应该是公认的答案 - 这适用于我的所有测试用例
    【解决方案3】:

    PHP 的 OpenSSL 函数(如 openssl_x509_parse)应该可以帮助您。

    【讨论】:

    • 如何构建它以读取站点的 SSL 信息?我不知道如何从第三方网站获取 SSL 信息。
    • 这个函数的坏处是PHP在5.6之前的旧版本中存在远程代码执行漏洞,标识为CVE-2013-6420。请参阅github.com/composer/ca-bundle/blob/master/src/CaBundle.php#L184,了解 Composer 尝试识别其运行的 PHP 是否安全的复杂方式。
    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 2018-06-18
    • 2013-07-09
    • 1970-01-01
    相关资源
    最近更新 更多