downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

openssl_x509_check_private_key> <openssl_sign
Last updated: Fri, 20 May 2011

view this page in

openssl_verify

(PHP 4 >= 4.0.4, PHP 5)

openssl_verifyVerificar una firma

Descripción

int openssl_verify ( string $data , string $signature , mixed $pub_key_id [, int $signature_alg = OPENSSL_ALGO_SHA1 ] )

openssl_verify() verifica que la firma signature es correcta para la información data especificada usando la clave pública asociada con pub_key_id. Ésto debe ser la clave pública que se corresponde con la clave privada usada para firmar.

Parámetros

data

signature

pub_key_id

signature_alg

Para más información véase la lista de Algoritmos de Firma.

Valores devueltos

Devuelve 1 si la firma es correcta, 0 si es incorrecta, y -1 si se produjo un error.

Historial de cambios

Versión Descripción
5.2.0 Se añadió el parámetro signature_alg.

Ejemplos

Example #1 Ejemplo de openssl_verify()

<?php
// se asume que $data y $signature contienen la información y la firma

// traer la clave pública desde el certifiado y prepararla
$fp fopen("/src/openssl-0.9.6/demos/sign/cert.pem""r");
$cert fread($fp8192);
fclose($fp);
$pubkeyid openssl_get_publickey($cert);

// establecer si la firma es correcta o no
$ok openssl_verify($data$signature$pubkeyid);
if (
$ok == 1) {
    echo 
"buena";
} elseif (
$ok == 0) {
    echo 
"mala";
} else {
    echo 
"alarmante, error verificando la firma";
}
// libera la clave de la memoria
openssl_free_key($pubkeyid);
?>

Ver también



openssl_x509_check_private_key> <openssl_sign
Last updated: Fri, 20 May 2011
 
add a note add a note User Contributed Notes openssl_verify
mikey at badpenguins dot com 07-Jun-2010 04:04
I spent days scouring the php openssl documentation trying to figure out how to do what sounds like a simple task - given two PEM encoded certificates, is one the signer of the other?  Nowhere in the openssl_verify() documentation or comments is it explained where to obtain the signature of an existing certificate.  The openssl_x509_parse() function looked promising, but it is an unstable API that may change.

I had to write my own code to determine if one cert signed another, it is located here: http://badpenguins.com/source/misc/isCertSigner.php?viewSource

In a nutshell here is what I learned...

The signature data in a signed X.509 certificate contains DER formatted data about the signature that is encrypted with the signers public key.  The data contains a hash of the original subject certificate and information about what encryption algorithm was used to create the signature.

So you need to get this signature data and a copy of the original certificate with the issuer and signature sequences removed.  Hash a copy of the original certificate (sans issuer/signature sequences) with the same algorithm the issuer used and if the hashes match, you have the issuer cert that signed the certificate.
Stiv 02-Mar-2006 02:34
I've finally found a way to verify signature. Sample in the documentation doesn't work. Code bellow DOES work :)

<?php
// $data is assumed to contain the data to be signed

// fetch certificate from file and ready it
$fp = fopen("path/file.pem", "r");
$cert = fread($fp, 8192);
fclose($fp);

// state whether signature is okay or not
// use the certificate, not the public key
$ok = openssl_verify($data, $signature, $cert);
if (
$ok == 1) {
    echo
"good";
} elseif (
$ok == 0) {
    echo
"bad";
} else {
    echo
"ugly, error checking signature";
}
?>
devel@no-spam 15-Jun-2005 01:25
It should be noted that in order to verify a signature successfully, SHA-1 must be used to digest the data before signing.

If, for example, you are using Java to create a signature and you want to verify it in PHP, you must not use "MD5withRSA" or "SHA512withRSA" as the signature algorithm. Use "SHA1withRSA" or the like...
steve dot venable at lmco dot com 30-May-2002 07:36
A note about the openssl_verify() (and some of the other functions).  The public key comes from a certificate in any of the support formats (as the example shows, use openssl_get_publickey() to get the resource id).  But after some trial and error I found the signature string MUST BE BINARY.  While no error occurs, passing a base64-formatted signature string (PEM format?), you simply get a mismatch.  When I did the base64 decode myself, the verify returned a match (return value 1).  You can simply drop the begin/end lines and take the output of the 'base64_decode()' function.
meint dot post at bigfoot dot com 09-Jun-2001 06:56
Anbybody trying to get a Win32 CryptoAPI based digital signature component to work with the openssl_verify() function should be aware that the CryptoAPI PKCS1 (RSA) method uses bytes in reverse order while the openssl_verify() method expects a correctly formatted PKCS1 digital signature (as should be). I learned this the hard way and it took me some time to dig this out. A simple solution in VBScript to reverse the byte order:

N = Len(Blob.Hex)

' reverse bytes in the signature using Hex format
For i = 1 To N - 1 Step 2
    s = Mid(Blob, i, 2) & s
Next

s contains the digital signature in reverse order. Blob is an arbitrary binary container.

Send the signature off in Hex format and use a hex2bin method in PHP to convert to the correct format for openssl_verify(), i.e.

function hex2bin($data) {

    $len = strlen($data);
    return pack("H" . $len, $data);

}

That's it, hope it helps out. BTW I used ASPEncrypt to toy around with on Win32 platform. Works only with Internet Explorer but you could also use a Java applet and have none of the abovementioned problems :-)

 
show source | credits | stats | sitemap | contact | advertising | mirror sites