2010-08-12 3 views
5

Tôi muốn biết là có thể đọc thông tin từ các bên khác bằng cách sử dụng PHP về thông tin chứng chỉ SSL của họ, tôi đã cố gắng tìm kiếm nó cho các lứa tuổi nhưng không có câu trả lời thực sự nào được tìm thấy cho tôi.Có thể đọc thông tin SSL bằng PHP từ bất kỳ trang web nào không?

Ví dụ, tôi đầu vào "www.paypal.com" vào kịch bản và nó sẽ trở lại như sau:

  • Authority: VeriSign, Inc
  • Hết hạn: 18 tháng 2 năm 2011 (18/02/11)
  • Loại: Extended Validation
  • Máy chủ: www.paypal.com
  • MD5: a8e7o7a8e9e9
  • SHA1: c2a4a1e4e3a2

Và, bất kỳ điều gì khác có thể có được. Tôi muốn kịch bản trong PHP xin vui lòng.

+0

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

Trả lời

2

Các chức năng OpenSSL của PHP như openssl_x509_parse sẽ giúp bạn.

+0

Tôi sẽ xây dựng nó như thế nào để đọc từ thông tin SSL của trang web? Tôi không biết cách lấy thông tin SSL từ trang web của bên thứ ba. –

+0

Điều xấu về chức năng này là PHP có lỗ hổng thực thi mã từ xa trong các phiên bản cũ hơn trước 5.6, được xác định là CVE-2013-6420. Xem https://github.com/composer/ca-bundle/blob/master/src/CaBundle.php#L184 cho cách phức tạp Composer cố gắng xác định xem PHP nó đang chạy có an toàn hay không. – 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

Tôi đã viết một lớp PHP để nhận thông tin 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>'; 

[Hãy chắc chắn rằng bạn hiểu được "nhanh chóng" phương pháp bên trong lớp SSL]. Cảm ơn bạn ...

+1

Đây phải là câu trả lời được chấp nhận - điều này phù hợp với tất cả các trường hợp thử nghiệm đối với tôi – Arthur