(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)
openssl_x509_checkpurpose — Проверяет, можно ли использовать сертификат для конкретных задач
$certificate,$purpose,$ca_info = [],$untrusted_certificates_file = null
openssl_x509_checkpurpose() проверяет сертификат,
чтобы узнать, может ли он использоваться с заданной целью purpose.
certificateСертификат.
purpose
| Константа | Описание |
|---|---|
| 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 | Можно ли использовать для любых задач? |
ca_info
ca_info должен содержать массив доверенных CA
файлов/директорий, как описано на странице проверки сертификатов.
untrusted_certificates_fileЕсли задано, то должно содержать путь до PEM-файла, содержащего сертификаты, которые могут быть использованы для проверки сертификата, но не являющиеся при этом доверенными.
Возвращает true , если сертификат можно использовать по указанному назначению,
false - если нельзя и -1 в случае возникновения ошибки.
| Версия | Описание |
|---|---|
| 8.0.0 |
certificate теперь принимает экземпляр OpenSSLCertificate ;
ранее принимался ресурс (resource ) типа OpenSSL X.509.
|
| 8.0.0 |
untrusted_certificates_file теперь допускает значение null.
|
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.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
<?php
$openssl_crtfile='auth.combined.pem';
$openssl_cadir='./ca';
$x509_res = openssl_x509_read(file_get_contents($openssl_crtfile));
if(empty($x509_res)) {
echo 'x509 cert could not be read'."\n";
}
$valid = openssl_x509_checkpurpose($x509_res,X509_PURPOSE_SSL_SERVER,array($openssl_cadir));
if ($valid === true) {
echo 'Certificate is valid for use as SSL server'."\n";
} else {
echo 'Certificate validation returned'.$valid."\n";
}
?>