2011-06-21 8 views
3

シリアル番号に関するSSL証明書情報を表示する必要があります。 私はPHP SSL証明書シリアル番号(16進数)

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

を使用する場合、私は -5573199485241205751 のように受け取るしかし、私は-serial -noout 'mycert.crt' -inコマンド のopensslのx509を実行したとき、私は シリアル= B2A80498A3CEDC09 がで受け取ることが可能である受け取りますPHP?おかげさまで

答えて

2

ありがとうございましたPetey B考えが面白かったので、検索の方向性を見つけるのを手伝ってください。 解決策は以下のとおりです。

動作するようには思えない
$serial_number= strtoupper(dechex($serial_number)); 
3

シリアル番号は、おそらくバイト配列として受け取ります。これらのバイトを16進数に変換すると、あなたはopensslを使って見ているシリアルを取得する必要があります。

1
php > $value = hexdec('B2A80498A3CEDC09'); 
php > echo dechex($value); 
b2a80498a3cee000 

。おそらく浮動小数点変換によるものです。

私はbcmathで1つの解決策を見ました。ここで

は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

あなたは、この目的のために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 
?>