【问题标题】:php curl certificate: curlopt_certinfo: where is serial number hiding?php curl证书:curlopt_certinfo:序列号隐藏在哪里?
【发布时间】:2015-04-15 09:09:25
【问题描述】:

卷曲和输出:找不到证书的序列号。

<?php
$curl = curl_init('https://www.comodo.com/');

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_NOBODY, true);
curl_setopt($curl, CURLOPT_CERTINFO, true);
curl_setopt($curl, CURLOPT_VERBOSE, 1);



curl_exec($curl);

$info = curl_getinfo($curl);
$certs = $info["certinfo"];
?> <pre><?php echo var_dump($certs) ?></pre> 

证书序列号隐藏在哪里?找不到 在这个例子中,答案应该是: 26:32:AC:57:23:86:91:BB:D5:88:D3:D8:E9:DA:0B:4E

注意:检索证书的其他变量,除了看起来不包括证书序列号。

【问题讨论】:

标签: php curl ssl-certificate


【解决方案1】:

这是一种解决方案。 Curl 提供对原始 Base64 编码证书的访问, 所以你可以使用openssl_x509_parse()解析它 获取序列号为整数字符串:

<?php
$curl = curl_init('https://www.comodo.com/');

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_NOBODY, true);
curl_setopt($curl, CURLOPT_CERTINFO, true);
curl_setopt($curl, CURLOPT_VERBOSE, 1);
curl_exec($curl);

$certInfo   = curl_getinfo($curl, CURLINFO_CERTINFO);
$rawCert    = $certInfo[0]['Cert'];
$parsedCert = openssl_x509_parse($rawCert);
$serialNum  = $parsedCert['serialNumber'];

var_dump($serialNum);

这将输出:

string(38) "50773774161050170991724859325180152654"

这对于dechex() 来说太大而无法转换为十六进制。 相反,您可以使用this code 这需要BCMath 扩展:

function bcdechex($dec)
{
    $hex = '';
    do {
        $last = bcmod($dec, 16);
        $hex = dechex($last) . $hex;
        $dec = bcdiv(bcsub($dec, $last), 16);
    } while ($dec > 0);
    return $hex;
}

$serialNumHex = bcdechex($serialNum);
$serialNumHex = chunk_split($serialNumHex, 2, ':');
$serialNumHex = trim($serialNumHex, ':');

var_dump($serialNumHex);

这将输出:

string(47) "26:32:ac:57:23:86:91:bb:d5:88:d3:d8:e9:da:0b:4e"

【讨论】:

    猜你喜欢
    • 2012-10-22
    • 2022-06-10
    • 2021-02-21
    • 1970-01-01
    • 2010-11-17
    • 2011-10-31
    • 2011-06-26
    • 2015-12-27
    • 2019-05-02
    相关资源
    最近更新 更多