Серийный номер сертификата SSL SSL в шестнадцатеричном формате - PullRequest
3 голосов
/ 21 июня 2011

Мне нужно отобразить информацию SSL-сертификата о серийном номере.Когда я использую

$cert = file_get_contents('mycert.crt');
$data=openssl_x509_parse($cert,true);
$data['serialNumber']

, я получаю как -5573199485241205751 Но когда я запускаю команду openssl x509 -in 'mycert.crt' -noout -serial, я получаю serial = B2A80498A3CEDC09 возможно ли получить в PHP?Спасибо.

Ответы [ 4 ]

3 голосов
/ 21 июня 2011

Вы, вероятно, получаете серийный номер в виде байтового массива. Преобразуйте эти байты в шестнадцатеричные, и вы должны получить серийный номер, который вы видите, используя openssl.

2 голосов
/ 22 июня 2011

Спасибо Пити Б. Идея была интересной, поэтому помогите мне найти направление для поиска.Решение:

$serial_number= strtoupper(dechex($serial_number));
1 голос
/ 10 октября 2011
php > $value = hexdec('B2A80498A3CEDC09');
php > echo dechex($value);
b2a80498a3cee000

Это не похоже на работу.Вероятно, из-за преобразования с плавающей запятой.

Я видел одно решение с bcmath.

Вот из confusa (http://www.assembla.com/code/confusa/git/nodes/lib/ca/Certificate.php?rev=a80a040c97fde2c170bb290d756c6729883fe80a):

                    /*
                     * PHP will return the serial as an integer, whereas
                     * everybody else use the hex-represenatation of the
                     * number.
                     *
                     * Due to the fact that Comodo uses *insanely* large
                     * serial-numbers, we need to be a bit creative when we
                     * get the serial as PHP won't cope with numbers larger
                     * than MAX_INT (2**32 on 32 bits arch)
                     */
                    $serial = $this->x509_parsed['serialNumber'] . "";
                    $base = bcpow("2", "32");
                    $counter = 100;
                    $res = "";
                    $val = $serial;

                    while($counter > 0 && $val > 0) {
                            $counter = $counter - 1;
                            $tmpres = dechex(bcmod($val, $base)) . "";
                            /* adjust for 0's */
                            for ($i = 8-strlen($tmpres); $i > 0; $i = $i-1) {
                                    $tmpres = "0$tmpres";
                            }
                            $res = $tmpres .$res;
                            $val = bcdiv($val, $base);
                    }
                    if ($counter <= 0) {
                            return false;
                    }
                    return strtoupper($res);

У меня не включен bcmath, поэтому я не могу его протестироватьна данный момент.

0 голосов
/ 09 февраля 2016

Вы можете использовать phpseclib для этих целей:

<?php
include('Math/BigInteger.php');

$cert_body = file_get_contents('mycert.crt');
$cert_decoded = openssl_x509_parse($cert_body, true);
echo $cert_decoded['serialNumber'] // outputs 5573199485241205751

$cert_serial = new Math_BigInteger($cert_decoded['serialNumber']);
$cert_serial = strtoupper($cert_serial->toHex());

echo $cert_serial // outputs B2A80498A3CEDC09
?>
...