开发者社区 问答 正文

PHP从特定URL获取SSL证书数据的问题

我想使用以下代码通过PHP提取所有SSL证书数据

$orignal_parse = parse_url($url, 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']);

这样,除了密钥大小,弱密钥,SSL证书类型,公共密钥算法,指纹(SHA256)细节之外,我已经获得了有关我的SSL证书的所有详细信息。

有人可以帮我吗

展开
收起
社区秘书 2019-12-09 15:52:24 738 分享 版权
阿里云 AI 助理回答

在PHP中提取SSL证书详细信息时,您已经使用了stream_context_createstream_socket_client以及openssl_x509_parse等函数来获取大部分证书信息。要补充您提到的密钥大小、弱密钥检查、SSL证书类型、公共密钥算法和指纹(SHA256),您可以基于已有的 $certinfo 变量进行进一步处理。下面是如何获取这些额外信息的示例代码:

  1. 密钥大小:通常可以从公钥信息中获取。如果您的 $certinfo 包含公钥信息,可以这样获取密钥大小:

    $keySize = openssl_pkey_get_details($certinfo['pubKey'])['bits'];
    
  2. 弱密钥检查:这需要您定义什么样的密钥被认为是“弱”的。例如,如果您认为小于2048位的RSA密钥是弱的,可以这样判断:

    $isWeakKey = $keySize < 2048;
    
  3. SSL证书类型:这个信息一般包含在证书的X509结构中,但直接从解析结果中获取可能不直观。通常,商业证书与自签名证书的区别在于颁发者字段是否与主题相同,但这不是严格意义上的“类型”。对于更具体的分类(如DV, OV, EV等),您可能需要查看issuerDNsubjectDN并结合其他外部信息。

  4. 公共密钥算法:这应该已经在 $certinfo 中,可以通过以下方式访问:

    $publicKeyAlgorithm = $certinfo['pubKey']['algorithm'];
    
  5. 指纹(SHA256):虽然 openssl_x509_parse 不直接提供指纹,但您可以使用 openssl_x509_fingerprint 函数来计算它:

    $certificateData = $certinfo['cert'];
    $fingerprint = openssl_x509_fingerprint($certificateData, "sha256");
    

整合以上代码段,您的完整代码可能看起来像这样:

$orignal_parse = parse_url($url, 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']);

// 获取密钥大小
$keySize = openssl_pkey_get_details($certinfo['pubKey'])['bits'];

// 检查是否为弱密钥(示例条件:小于2048位)
$isWeakKey = $keySize < 2048;

// 公共密钥算法
$publicKeyAlgorithm = $certinfo['pubKey']['algorithm'];

// 计算SHA256指纹
$certificateData = $certinfo['cert'];
$fingerprint = openssl_x509_fingerprint($certificateData, "sha256");

// 输出或进一步处理这些信息
echo "密钥大小: " . $keySize . "\n";
echo "是否为弱密钥: " . ($isWeakKey ? "是" : "否") . "\n";
echo "公共密钥算法: " . $publicKeyAlgorithm . "\n";
echo "SHA256指纹: " . $fingerprint . "\n";

请注意,实际应用中可能需要根据具体情况调整上述代码,比如错误处理和对不同证书类型的更细致区分。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答