The PHP Online Conference 2021


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

openssl_x509_checkpurposeПроверяет, можно ли использовать сертификат для конкретных задач


openssl_x509_checkpurpose ( mixed $x509cert , int $purpose [, array $cainfo = array() [, string $untrustedfile ]] ) : int

openssl_x509_checkpurpose() проверяет сертификат, чтобы узнать, может ли он использоваться с заданной целью purpose.

Список параметров




Цели openssl_x509_checkpurpose()
Константа Описание
X509_PURPOSE_SSL_CLIENT Можно ли использовать сертификат для SSL соединения на стороне клиента?
X509_PURPOSE_SSL_SERVER Можно ли использовать сертификат для SSL соединения на стороне сервера?
X509_PURPOSE_NS_SSL_SERVER Можно ли использовать для сервера Netscape SSL?
X509_PURPOSE_SMIME_SIGN Можно ли подписывать S/MIME email?
X509_PURPOSE_SMIME_ENCRYPT Можно ли шифровать S/MIME email?
X509_PURPOSE_CRL_SIGN Можно ли им подписывать список отзыва сертификатов (CRL)?
X509_PURPOSE_ANY Можно ли использовать для любых задач?
Эти опции не являются бинарной маской - можно использовать только одно значение за раз!


cainfo должен содержать массив доверенных CA файлов/директорий, как описано на странице проверки сертификатов.


Если задано, то должно содержать путь до PEM-файла, содержащего сертификаты, которые могут быть использованы для проверки сертификата, но не являющиеся при этом доверенными.

Возвращаемые значения

Возвращает TRUE, если сертификат можно использовать по указанному назначению, FALSE - если нельзя и -1 в случае ошибки.

add a note add a note

User Contributed Notes 3 notes

adr at NOSPAM dot entropymatrix dot com
7 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";
dingyuan at tencent dot com
2 months 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.
chaoszcat at gmail dot com
8 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