【问题标题】:Function to check SSL takes too long to load检查 SSL 的功能加载时间过长
【发布时间】:2020-11-06 06:34:40
【问题描述】:

我有一个功能可以检查 ssl 在我在这里找到的域上是否正常工作。

function has_ssl($domain)
{
    $ssl_check = fsockopen('ssl://' . $domain, 443, $errno, $errstr, 1000);
    $res = !!$ssl_check;
    if ($res == 1) {
        return true;
    } else {
        return false;
    }
}

我正在寻找一种替代功能,因为该功能需要很长时间才能加载,并且当我必须检查数百个域的 ssl 时,它也会出现服务器超时错误。如果有人可以给我一个很棒的替代功能。

【问题讨论】:

    标签: php http ssl https


    【解决方案1】:

    很高兴为您提供帮助!

    首先,定义一个获取 ssl 证书信息的函数:

    function get_cert_info($domain){
        $context = stream_context_create(['ssl' => [
            'capture_peer_cert' => true,
            'capture_peer_cert_chain' => true,
            ],
        ]);
    
        $client = stream_socket_client("ssl://".$domain.":443", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
        if($client==false) {
            return false;
        }
        $params = stream_context_get_params($client);
        $cert = $params['options']['ssl']['peer_certificate'];
        $cert_info = openssl_x509_parse($cert);
        return $cert_info;
    }
    

    然后像这样使用它来检查域:

    $domain = 'example.com';
    $cert_info = get_cert_info($domain);
    $validTo_time_t = $cert_info['validTo_time_t'];
    $validTo_time_d = date('Y-m-d H:i:s', $validTo_time_t);
    if($validTo_time_d>date('Y-m-d H:i:s',now())) echo "true";
    else echo "false";
    

    另外,我刚刚检查了代码中的时间。

    您可以查看其他信息,例如:证书发布者、证书发布时间......

    希望它有效!

    祝你有美好的一天!

    【讨论】:

    • 这可行,但仍然需要相同的时间来加载:(
    【解决方案2】:

    你的超时时间太大了,可能 15 秒就足够了(高于这意味着无论如何都有问题)。同样为了可扩展性,您需要某种多任务处理方式。我喜欢将parallel 用于此类任务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-23
      • 2016-06-20
      • 2016-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多