Можно ли читать информацию SSL в PHP с любого сайта?

Я хочу знать, есть ли возможность читать информацию от других сторон, использующих PHP о своей информации о сертификатах SSL, я пытался найти ее на протяжении веков, но нет никакого реального ответа, который был найден для меня.

Например, я ввожу «www.paypal.com» в скрипт, и он вернет следующее:

  • Полномочия: VeriSign, Inc
  • Срок действия: 18 февраля 2011 г. (18/02/11)
  • Тип: расширенная проверка
  • Хост: www.paypal.com
  • MD5: a8e7o7a8e9e9
  • SHA1: c2a4a1e4e3a2

И все, что можно получить. Мне нужен скрипт в PHP, пожалуйста.

 <? PHP
 $ g = stream_context_create (array ("ssl" => 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"]));
 ?>

Функции OpenSSL PHP, такие как openssl_x509_parse, должны помочь вам.

Я написал 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"), "+"); } } 

EX:

 $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]. Спасибо…