王新阳

wangxinyang

PHP获取网站SSL证书有效期

function getSSLCertificateExpiry($domain, $port = 443) {
    // 创建 SSL 上下文,启用证书捕获
    $context = stream_context_create([
        'ssl' => [
            'capture_peer_cert' => true,
            'capture_peer_cert_chain' => true,
            'verify_peer' => true, // 强烈建议启用证书验证
            'verify_peer_name' => true, // 强烈建议启用域名匹配验证
            // 如果在容器或特殊环境中遇到 CA 证书问题,可能需要指定 CA 文件路径
            // 'cafile' => '/path/to/cacert.pem',
        ]
    ]);

    // 建立 SSL 连接
    $socket = @stream_socket_client("ssl://{$domain}:{$port}", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
    
    if (!$socket) {
        return ['error' => "连接失败: {$errstr} (错误码: {$errno})"];
    }

    // 获取连接参数,提取证书
    $params = stream_context_get_params($socket);
    if (!isset($params['options']['ssl']['peer_certificate'])) {
        return ['error' => '未收到证书'];
    }

    $cert = $params['options']['ssl']['peer_certificate'];
    $certInfo = openssl_x509_parse($cert);
    
    if (!$certInfo) {
        return ['error' => '证书解析失败'];
    }

    // 提取有效期信息
    $validFrom = date('Y-m-d H:i:s', $certInfo['validFrom_time_t']);
    $validTo = date('Y-m-d H:i:s', $certInfo['validTo_time_t']);
    $isExpired = $certInfo['validTo_time_t'] < time();

    return [
        'subject' => $certInfo['subject']['CN'] ?? 'N/A',
        'issuer' => $certInfo['issuer']['CN'] ?? 'N/A',
		'date_of_issue' => $validFrom,
        'expires_at' => $validTo,
        'expires_timestamp' => $certInfo['validTo_time_t'],
        'expired' => $isExpired,
		'left_days' => floor(($certInfo['validTo_time_t']-time())/86400),
    ];
}

$domain = 'www.baidu.com'; // 替换为你要查询的域名
$result = getSSLCertificateExpiry($domain);
if (isset($result['error'])) {
    echo "错误: " . $result['error'] . "\n";
} else {
    echo "证书信息:\n";
    echo "  主题 (CN): " . $result['subject'] . "\n";
    echo "  签发者: " . $result['issuer'] . "\n";
    echo "  颁发时间: " . $result['date_of_issue'] . "\n";
    echo "  到期时间: " . $result['expires_at'] . "\n";
    echo "  是否已过期: " . ($result['expired'] ? '是' : '否') . "\n";
    echo "  剩余天数: " . $result['left_days'] . "\n";
}

输出

证书信息:
  主题 (CN): baidu.com
  签发者: GlobalSign RSA OV SSL CA 2018
  颁发时间: 2025-07-09 07:01:02
  到期时间: 2026-08-10 07:01:01
  是否已过期: 否
  剩余天数: 182

$result = getSSLCertificateExpiry($domain);
获取到的证书所有信息:

Array
(
    [name] => /C=CN/ST=beijing/L=beijing/O=Beijing Baidu Netcom Science Technology Co., Ltd/CN=baidu.com
    [subject] => Array
        (
            [C] => CN
            [ST] => beijing
            [L] => beijing
            [O] => Beijing Baidu Netcom Science Technology Co., Ltd
            [CN] => baidu.com
        )

    [hash] => 7476f7c7
    [issuer] => Array
        (
            [C] => BE
            [O] => GlobalSign nv-sa
            [CN] => GlobalSign RSA OV SSL CA 2018
        )

    [version] => 2
    [serialNumber] => 27025959261604984493724308777
    [serialNumberHex] => 5753597B3F311D38E6629529
    [validFrom] => 250709070102Z
    [validTo] => 260810070101Z
    [validFrom_time_t] => 1752044462
    [validTo_time_t] => 1786345261
    [signatureTypeSN] => RSA-SHA256
    [signatureTypeLN] => sha256WithRSAEncryption
    [signatureTypeNID] => 668
    [purposes] => Array
        (
            [1] => Array
                (
                    [0] => 1
                    [1] => 
                    [2] => sslclient
                )

            [2] => Array
                (
                    [0] => 1
                    [1] => 
                    [2] => sslserver
                )

            [3] => Array
                (
                    [0] => 1
                    [1] => 
                    [2] => nssslserver
                )

            [4] => Array
                (
                    [0] => 
                    [1] => 
                    [2] => smimesign
                )

            [5] => Array
                (
                    [0] => 
                    [1] => 
                    [2] => smimeencrypt
                )

            [6] => Array
                (
                    [0] => 
                    [1] => 
                    [2] => crlsign
                )

            [7] => Array
                (
                    [0] => 1
                    [1] => 1
                    [2] => any
                )

            [8] => Array
                (
                    [0] => 1
                    [1] => 
                    [2] => ocsphelper
                )

            [9] => Array
                (
                    [0] => 
                    [1] => 
                    [2] => timestampsign
                )

        )

    [extensions] => Array
        (
            [keyUsage] => Digital Signature, Key Encipherment
            [basicConstraints] => CA:FALSE
            [authorityInfoAccess] => CA Issuers - URI:http://secure.globalsign.com/cacert/gsrsaovsslca2018.crt
OCSP - URI:http://ocsp.globalsign.com/gsrsaovsslca2018

            [certificatePolicies] => Policy: 1.3.6.1.4.1.4146.1.20
  CPS: https://www.globalsign.com/repository/
Policy: 2.23.140.1.2.2

            [crlDistributionPoints] => 
Full Name:
  URI:http://crl.globalsign.com/gsrsaovsslca2018.crl

            [subjectAltName] => DNS:baidu.com, DNS:baifubao.com, DNS:www.baidu.cn, DNS:www.baidu.com.cn, DNS:mct.y.nuomi.com, DNS:apollo.auto, DNS:dwz.cn, DNS:*.baidu.com, DNS:*.baifubao.com, DNS:*.baidustatic.com, DNS:*.bdstatic.com, DNS:*.bdimg.com, DNS:*.hao123.com, DNS:*.nuomi.com, DNS:*.chuanke.com, DNS:*.trustgo.com, DNS:*.bce.baidu.com, DNS:*.eyun.baidu.com, DNS:*.map.baidu.com, DNS:*.mbd.baidu.com, DNS:*.fanyi.baidu.com, DNS:*.baidubce.com, DNS:*.mipcdn.com, DNS:*.news.baidu.com, DNS:*.baidupcs.com, DNS:*.aipage.com, DNS:*.aipage.cn, DNS:*.bcehost.com, DNS:*.safe.baidu.com, DNS:*.im.baidu.com, DNS:*.baiducontent.com, DNS:*.dlnel.com, DNS:*.dlnel.org, DNS:*.dueros.baidu.com, DNS:*.su.baidu.com, DNS:*.91.com, DNS:*.hao123.baidu.com, DNS:*.apollo.auto, DNS:*.xueshu.baidu.com, DNS:*.bj.baidubce.com, DNS:*.gz.baidubce.com, DNS:*.smartapps.cn, DNS:*.bdtjrcv.com, DNS:*.hao222.com, DNS:*.haokan.com, DNS:*.pae.baidu.com, DNS:*.vd.bdstatic.com, DNS:*.cloud.baidu.com, DNS:click.hm.baidu.com, DNS:log.hm.baidu.com, DNS:cm.pos.baidu.com, DNS:wn.pos.baidu.com, DNS:update.pan.baidu.com
            [extendedKeyUsage] => TLS Web Server Authentication, TLS Web Client Authentication
            [authorityKeyIdentifier] => keyid:F8:EF:7F:F2:CD:78:67:A8:DE:6F:8F:24:8D:88:F1:87:03:02:B3:EB

            [subjectKeyIdentifier] => BA:91:7C:55:A9:8F:1F:B0:02:60:27:BB:D7:D3:03:AF:2D:AB:AD:1D
            [ct_precert_scts] => Signed Certificate Timestamp:
    Version   : v1 (0x0)
    Log ID    : AC:AB:30:70:6C:EB:EC:84:31:F4:13:D2:F4:91:5F:11:
                1E:42:24:43:B1:F2:A6:8C:4F:3C:2B:3B:A7:1E:02:C3
    Timestamp : Jul  9 07:01:09.629 2025 GMT
    Extensions: none
    Signature : ecdsa-with-SHA256
                30:44:02:20:35:DB:47:71:C6:0E:36:D4:9E:87:46:9D:
                8D:5C:1D:19:7F:A9:53:C0:1A:8F:16:2D:C2:03:2B:71:
                0B:C6:1D:53:02:20:22:0E:91:A8:C5:87:93:93:D6:48:
                35:F5:24:7B:F6:F5:FF:3D:56:F3:9D:DB:4C:72:86:2D:
                4A:AD:77:45:52:CF
Signed Certificate Timestamp:
    Version   : v1 (0x0)
    Log ID    : CB:38:F7:15:89:7C:84:A1:44:5F:5B:C1:DD:FB:C9:6E:
                F2:9A:59:CD:47:0A:69:05:85:B0:CB:14:C3:14:58:E7
    Timestamp : Jul  9 07:01:09.640 2025 GMT
    Extensions: none
    Signature : ecdsa-with-SHA256
                30:46:02:21:00:BC:C9:FA:F8:1A:19:CB:22:CF:BF:6D:
                A3:22:F6:A7:36:7B:C5:35:A1:A5:F7:AD:23:B8:59:2D:
                8B:97:09:68:E3:02:21:00:AB:19:F4:52:A5:FB:57:80:
                2C:64:F1:A9:5F:EE:77:DA:7C:97:78:37:85:8B:0D:41:
                CC:85:80:3C:2E:71:5B:81
Signed Certificate Timestamp:
    Version   : v1 (0x0)
    Log ID    : D7:6D:7D:10:D1:A7:F5:77:C2:C7:E9:5F:D7:00:BF:F9:
                82:C9:33:5A:65:E1:D0:B3:01:73:17:C0:C8:C5:69:77
    Timestamp : Jul  9 07:01:09.600 2025 GMT
    Extensions: none
    Signature : ecdsa-with-SHA256
                30:45:02:20:1E:5F:24:19:17:79:DD:66:DA:B1:09:B7:
                11:9F:DA:3C:49:A5:21:7B:10:1E:FF:7C:8F:E8:12:0B:
                45:FE:38:AA:02:21:00:B7:97:A9:BD:A2:27:A1:08:79:
                42:B5:18:DE:4E:76:C1:1D:0D:35:AC:F5:32:3B:05:7C:
                9D:8C:4C:87:77:A8:0C
        )

)
2026-02-09
2026-02-09 星期一 农历腊月二十二