openssl_x509_checkpurpose

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

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

说明

openssl_x509_checkpurpose(
    OpenSSLCertificate|string $certificate,
    int $purpose,
    array $ca_info = [],
    ?string $untrusted_certificates_file = null
): bool|int

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

参数

certificate

要检查的证书。

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 证书是否可以用于任何/所有目的?
这些选项不是位域 - 您只能指定一个!

ca_info

ca_info 应是一个包含受信任 CA 文件/目录的数组,如 证书验证 中所述。

untrusted_certificates_file

如果指定,则应为包含用于帮助验证证书的证书的 PEM 编码文件的名称,尽管对来自该文件 的证书不予信任。

返回值

如果证书可以用于预期目的,则返回 true,如果不能,则返回 false,或在出错时返回 -1。

变更日志

版本 说明
8.0.0 certificate 现在接受 OpenSSLCertificate 实例;之前,接受类型为 OpenSSL X.509资源
8.0.0 untrusted_certificates_file 现在可以为空。
添加笔记

用户贡献笔记 3 个笔记

10
dingyuan at tencent dot com
4 年前
简单来说:如果你设置 $purpose=0,你可以使用此函数来验证证书链。

====================================================================

我想验证一个证书链。就像这样
userCert.pem => middleCert.pem => rootCert.pem

我发现这些 openssl 函数中没有一个直接提供此功能。并且一些朋友和我一样有这样的需求,"mikey at badpenguins dot com" 甚至编写了他自己的代码来验证证书链(你可以在 openssl_verify 下方的笔记中看到)。

并且我注意到 openssl_verify 下方有一个 -3 个赞的笔记,上面写着 "在 php 中验证 X509 证书链似乎可以通过 openssl_x509_checkpurpose() 来实现",并且我阅读了关于此函数的源代码,给定的关于 $purpose 的常量变量(例如 X509_PURPOSE_SSL_CLIENT)是 1-7,如果你设置 $purpose 在 1-7 之间,你无法验证证书链。设置 $purpose=0 可以获得关于验证证书链的真实结果。

并且我给那个 -3 个赞的笔记点了赞,现在它有 -2 个赞了,哈哈。
6
adr at NOSPAM dot entropymatrix dot com
11 年前
以下是 openssl_x509_checkpurpose 的示例用法。它等效于以下 openssl verify 命令
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";
}
?>
-15
chaoszcat at gmail dot com
11 年前
几天前,我在我的系统上双启动进入 Windows 8 并玩弄它,然后我重新启动回到 Windows 7,突然这个函数失败了,一直返回给我 0。

花了近两个小时在谷歌上搜索,没有结果,我几乎放弃了研究。

然后(我不知道为什么)我进行了系统时间更新(与 time.nist.gov 同步),突然这个函数返回给我 1(真)。

确实,当我重新启动到 Windows 7 时,我的时间比当前时间晚了好几个小时,我手动进行了更改。我怀疑这与这个函数有关吗?

希望这有帮助。

关键字:谷歌发现,openid,发现
平台:Windows 7 64 位,PHP 5.3.13
To Top