卷曲和输出:无法找到证书的序列号。
<?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
注意:检索证书的其他变量,但不包括证书序列号。
答案 0 :(得分: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"