PHP関数openssl_verify()を使用して、異なるX.509証明書の署名を検証したいと考えています。証明書から署名アルゴリズムを取得する方法は?
signature algorithm以外は(証明書、$データ、$署名、$ pub_key_id)が必要ですが、証明書に格納されています。
私の簡単な質問は:どのように私は、証明書から署名アルゴリズムを抽出することができますか?
PHP関数openssl_verify()を使用して、異なるX.509証明書の署名を検証したいと考えています。証明書から署名アルゴリズムを取得する方法は?
signature algorithm以外は(証明書、$データ、$署名、$ pub_key_id)が必要ですが、証明書に格納されています。
私の簡単な質問は:どのように私は、証明書から署名アルゴリズムを抽出することができますか?
この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');
}
一つの方法は、このことについてopenssl x509 -text -noout < $certfile | grep "Signature Algorithm"
残念ながら、私は私のスクリプトからPHPの関数を呼び出すことができます。 – Mike
どうなるのでしょうか?
$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"
。
aha! openssl_x509_export()にオプションのパラメータ "bool $ notext = TRUE"を使用しています。シンプルで巧妙なソリューション。これまでのベストアンサー(これは唯一の働き者なので難しくない;-)たくさんありがとう。 – Mike
非常にクールな解決策 –
を...
<?php
include('File/X509.php');
$x509 = new File_X509();
$cert = $x509->loadX509(file_get_contents('sample.pem'));
echo $cert['signatureAlgorithm']['algorithm'];
は、魅力のように動作します、ありがとう! – Mike