extension - php 7.2 openssl
¿Cómo obtener el algoritmo de firma de un certificado? (4)
Una forma podría ser openssl x509 -text -noout < $certfile | grep "Signature Algorithm"
openssl x509 -text -noout < $certfile | grep "Signature Algorithm"
Quiero usar la función PHP openssl_verify () para verificar las firmas de diferentes certificados X.509.
Tengo todo lo que necesita (certificado, $ data, $ signature, $ pub_key_id) excepto el algoritmo de la firma pero que está almacenado en el certificado.
Mi pregunta simple es: ¿cómo puedo extraer el algoritmo de firma de los certificados?
¿Qué tal esto?
$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);
Produce la salida:
string(21) "sha1WithRSAEncryption"
Que debería asignar a OPENSSL_ALGO_SHA1
usted mismo.
Usando phpseclib, un analizador PHP X.509 puro ...
<?php
include(''File/X509.php'');
$x509 = new File_X509();
$cert = $x509->loadX509(file_get_contents(''sample.pem''));
echo $cert[''signatureAlgorithm''][''algorithm''];
Mire esta pregunta , puede hacerlo de manera similar, intente esto:
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'');
}