2010-08-12 9 views
5

Je veux savoir s'il est possible de lire des informations d'autres parties utilisant PHP sur leurs informations de certificat SSL, j'ai essayé de trouver à ce sujet depuis des lustres mais il n'y a pas de vraie réponse qui a été trouvée pour moi.Est-il possible de lire des informations SSL en PHP à partir de n'importe quel site Web?

Par exemple, je entrée "www.paypal.com" dans le script et il retournera les éléments suivants:

  • Autorité: VeriSign, Inc
  • Expire: Le 18 Février 2011 (18/02/11)
  • type: Extended validation
  • hôte: www.paypal.com
  • MD5: a8e7o7a8e9e9
  • SHA1: c2a4a1e4e3a2

Et, tout ce qui est possible d'obtenir. Je voudrais le script en PHP s'il vous plaît.

+0

Voir http://stackoverflow.com/questions/3081042/how-to-get-ssl-certificate-info-with-curl-in-php/3081093#3081093 – Artefacto

Répondre

2

Les fonctions OpenSSL de PHP comme openssl_x509_parse devraient vous aider.

+0

Comment le construire lire à partir des informations SSL d'un site? Je ne sais pas comment obtenir des informations SSL à partir d'un site Web tiers. –

+0

La mauvaise chose à propos de cette fonction est que PHP a une vulnérabilité d'exécution de code à distance dans les anciennes versions antérieures à 5.6, identifiées comme CVE-2013-6420. Voir https://github.com/composer/ca-bundle/blob/master/src/CaBundle.php#L184 pour la manière compliquée Composer essaie d'identifier si le PHP sur lequel il s'exécute est sûr. – Sven

6
 
<?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"])); 
?> 
3

J'ai écrit une classe PHP pour obtenir des informations 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>'; 

[méthode Assurez-vous de comprendre la "instancier" à l'intérieur de classe SSL]. Merci ...

+1

Cela devrait être la réponse acceptée - cela fonctionne pour tous les cas de test pour moi – Arthur