openssl_x509_checkpurpose

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

openssl_x509_checkpurpose验证是否可以为特定目的使用证书

说明

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

openssl_x509_checkpurpose() 检查证书以查看它是否可用于指定目的 purpose.

参数

x509cert

被检查的证书。

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 邮件?
X509_PURPOSE_SMIME_ENCRYPT 正式是否可用用来加密 S/MIME 邮件?
X509_PURPOSE_CRL_SIGN 证书是否可以用来签名证书撤销列表(CRL)?
X509_PURPOSE_ANY 证书是否可以用于任何目的?
这些选项不是位字段——您只能指定一个字段!

cainfo

cainfo 应该是一个受信任的 CA 文件/文件夹组成的数组,如Certificate Verification所描述的一样。

untrustedfile

如果指定,这应该是PEM编码文件的名称,该文件持有证书,可以用来帮助验证证书,尽管从该文件中获得的证书不受信任。

返回值

如果证书可以用于预期目的,返回 true,如果不行,则返回 false 错误便会返回 -1。

User Contributed Notes

dingyuan at tencent dot com 11-Aug-2020 07:15
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 17-May-2013 04:24
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";
}
?>
chaoszcat at gmail dot com 16-Aug-2012 04:05
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 time.nist.gov), 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