PHPCon Poland 2024


(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

openssl_x509_checkpurposeVerifica si un certificado se puede usar para un propósito en particular


    mixed $x509cert,
    int $purpose,
    array $cainfo = array(),
    string $untrustedfile = ?
): int

openssl_x509_checkpurpose() examina un certificado para ver si se puede usar para el propósito purpose especificado.



El certificado examinado.


Propósitos de openssl_x509_checkpurpose()
Constante Descripción
X509_PURPOSE_SSL_CLIENT ¿El certificado puede ser usado por el lado del cliente de una conexión SSL?
X509_PURPOSE_SSL_SERVER ¿El certificado puede ser usado por el lado del servidor de una conexión SSL?
X509_PURPOSE_NS_SSL_SERVER ¿El certificado puede ser usado por un servidor SSL Netscape?
X509_PURPOSE_SMIME_SIGN ¿Se puede usar el certificado para firmar un email S/MIME?
X509_PURPOSE_SMIME_ENCRYPT ¿Se puede usar el certificado para encriptar un email S/MIME?
X509_PURPOSE_CRL_SIGN ¿Se puede usar el certificado para firmar una Lista de Revocación de Certificado (CRL en inglés)?
X509_PURPOSE_ANY ¿Se puede usar el certificado para Cualquier/Todos los propósitos?
Estas opciones no son campos de bits - ¡sólo se puede especificar una!


cainfo debería ser una matriz de archivos/directorios de una AC de confianza, como está descrito en Verificación de Certificados.


Si se especifica debería ser el nombre de un archivo PEM codificado que contiene los certificados que se pueden usar para ayudar a verificar el certificado, aunque no se pone confianza en los certificados que vienen de ese archivo.

Valores devueltos

Devuelve true si el certificado se puede usar para el propósito previsto, false si no se puede, o -1 si se produjo un error.

add a note

User Contributed Notes 3 notes

dingyuan at tencent dot com
3 years ago
in one word :if you set $purpose=0, you can use this function to verify certificate chain.


I want to verify a certificate chain. just like this:
userCert.pem => middleCert.pem => rootCert.pem

I figured that none of these openssl functions provide this function directly. And some friends have same need as me, "mikey at badpenguins dot com" even write his own code to verify certificate chain(you can see notes below openssl_verify).

and I notice a note which has '-3' likes below openssl_verify, it says "validating an X509 certificate chain in php seems to be possible with openssl_x509_checkpurpose()", and I read the source code about this function, the given constant var about $purpose (like X509_PURPOSE_SSL_CLIENT ) is 1-7, and if you set $purpose among 1-7, you cannot verify the cert chain. Set $purpose=0 can get the truly result about verify a cert chain.

and I give that '-3' note a thumb-up, now it has -2 , lol.
adr at NOSPAM dot entropymatrix dot com
11 years ago
The following is an example usage of openssl_x509_checkpurpose. It is equivalent to the openssl verify command as follows:
openssl verify -CApath $openssl_cadir -purpose sslserver $openssl_crtfile


$x509_res = openssl_x509_read(file_get_contents($openssl_crtfile));
$x509_res)) {
'x509 cert could not be read'."\n";
$valid = openssl_x509_checkpurpose($x509_res,X509_PURPOSE_SSL_SERVER,array($openssl_cadir));
if (
$valid === true) {
'Certificate is valid for use as SSL server'."\n";
} else {
'Certificate validation returned'.$valid."\n";
chaoszcat at gmail dot com
11 years ago
Few days ago I dual boot my system into Windows 8 and play around with it, and then I boot it back to windows 7, and all of sudden this function fails by returning me 0 all the time.

Spent almost two hours digging google for no result, I almost end my research.

Then (I don't know why) I did a system time update (synchronize with, and all of sudden, this function returns me 1 (true).

It's true that when I boot back to Windows 7 my time has been screwed by a few hours later than my current time, and I did a manual change on it. I doubt this has anything to do with this function?

Hope it helps.

Keywords: google discovery, openid, discovery
Platform: Windows 7 64bit, PHP 5.3.13
To Top