2012-03-09 18 views

答えて

5

このquestionを見て、あなたはそれが類似し、これ試す行うことができます。phpseclib, a pure PHP X.509 parserを使用して

private function GetCertSignatureAlgorithm($certSignatureBinary, $pubKeyResourceId) 
{ 

if(false === openssl_public_decrypt($certSignatureBinary, $sigString, $pubKeyResourceId)) 
{ 
    return false; 
} 

if (empty($sigString) || 
    strlen($sigString) < 5) 
{ 
    return false; 
} 

if (ord($sigString[0]) !== 0x30 || 
    ord($sigString[2]) !== 0x30 || 
    ord($sigString[4]) !== 0x06) 
{ 
    return false; 
} 

$sigString = substr($sigString, 4); 
$len  = ord($sigString[1]); 
$bytes  = 0; 

if ($len & 0x80) 
{ 
    $bytes = ($len & 0x7f); 
    $len = 0; 
    for ($i = 0; $i < $bytes; $i++) 
    { 
     $len = ($len << 8) | ord($sigString[$i + 2]); 
    } 
} 

$oidData = substr($sigString, 2 + $bytes, $len); 
$hashOid = floor(ord($oidData[0])/40) . '.' . ord($oidData[0]) % 40; 

$value = 0; 
for ($i = 1; $i < strlen($oidData); $i++) 
{ 
    $value = $value << 7; 
    $value = $value | (ord($oidData[$i]) & 0x7f); 
    if (!(ord($oidData[$i]) & 0x80)) 
    { 
     $hashOid .= '.' . $value; 
     $value = 0; 
    } 
} 

//www.iana.org/assignments/hash-function-text-names/hash-function-text-names.xml 
//www.php.net/manual/en/openssl.signature-algos.php 
switch($hashOid) 
{ 
    case '1.2.840.113549.2.5':  return 'md5'; 
    case '1.3.14.3.2.26':   return 'sha1'; 
    case '2.16.840.1.101.3.4.2.1': return 'sha256'; 
    case '2.16.840.1.101.3.4.2.2': return 'sha384'; 
    case '2.16.840.1.101.3.4.2.3': return 'sha512'; 

    //not secure = not accepted 
    //case '1.2.840.113549.2.2':  //'md2'; 
    //case '1.2.840.113549.2.4':  //'md4'; 
    //case '1.3.14.3.2.18':   //'sha'; 
} 

throw new Exception('CertSignatureAlgorithm not found'); 
} 
+0

は、魅力のように動作します、ありがとう! – Mike

-1

一つの方法は、このことについてopenssl x509 -text -noout < $certfile | grep "Signature Algorithm"

+0

残念ながら、私は私のスクリプトからPHPの関数を呼び出すことができます。 – Mike

6

どうなるのでしょうか?

$cer = file_get_contents('certificate.cer'); 
$res = openssl_x509_read($cer); 
openssl_x509_export($res, $out, FALSE); 
$signature_algorithm = null; 
if(preg_match('/^\s+Signature Algorithm:\s*(.*)\s*$/m', $out, $match)) $signature_algorithm = $match[1]; 
var_dump($signature_algorithm); 

それは出力を生成します。あなたはOPENSSL_ALGO_SHA1に自分自身をマッピングする必要があります

string(21) "sha1WithRSAEncryption" 

+0

aha! openssl_x509_export()にオプションのパラメータ "bool $ notext = TRUE"を使用しています。シンプルで巧妙なソリューション。これまでのベストアンサー(これは唯一の働き者なので難しくない;-)たくさんありがとう。 – Mike

+0

非常にクールな解決策 –

1

を...

<?php 
include('File/X509.php'); 

$x509 = new File_X509(); 
$cert = $x509->loadX509(file_get_contents('sample.pem')); 
echo $cert['signatureAlgorithm']['algorithm']; 
関連する問題