在检查(正确指定的)$ cainfo变量时,PHP的openssl_check_purpose()函数在确定有效性时会考虑撤销吗? API的文档有点缺乏,将验证过程保留为"黑盒子"对非专家。
如果是,那么失败的标准是否被认为是可以通过调用openssl_error_string来检索的错误,或者我是否必须做其他事情以找出它无效的原因?
如果没有,是否有一个我失踪的功能,让我从一个"捆绑"文件,以便我可以从中获取CRL并手动检查?
(根据another question接受的答案,C#中的检查确实包括撤销,但我已经学会了在PHP中不采取任何理由。)
更新:
经过一些手动测试后,openssl_check_purpose()似乎不检查吊销。我怀疑这部分可能是因为我对本地demoCA进行了测试,并且ca证书并未包含任何CRL信息。
测试代码:
$pemfile = "/home/dev/cert1.pem"; //"Good" certificate
$revfile = "/home/dev/cert2.pem"; //"Revoked" certificate
$cafile = "/home/dev/local-ca.crt";
$error = null;
$pemcansign = openssl_x509_checkpurpose(
openssl_x509_read(file_get_contents($pemfile)),
X509_PURPOSE_SMIME_SIGN,array($cafile));
if ($error = openssl_error_string()){
echo "SSL Error At 22: ".$error."\n";
}
$revcansign = openssl_x509_checkpurpose(
openssl_x509_read(file_get_contents($revfile)),
X509_PURPOSE_SMIME_SIGN,array($cafile));
if ($error = openssl_error_string()){
echo "SSL Error At 22: ".$error."\n";
}
echo "PEM Key can " .
($pemcansign === true ?"":"NOT ") .
"be used for signing S/MIME (Result: $pemcansign)\n";
echo "Revoked PEM Key can " .
($revcansign === true ?"":"NOT ") .
"be used for signing S/MIME (Result: $revcansign)\n";
仍然导致输出:
PEM Key can be used for signing S/MIME (Result: 1)
Revoked PEM Key can be used for signing S/MIME (Result: 1)
更新2:
经过更多测试后,看起来即使OpenSSL也不会自动检查撤销列表。
答案 0 :(得分:0)
因此所有证据都指向“否”,并且openssl_ * API中似乎没有独立的函数来处理它。只要exec()没有被禁用,看起来你通常可以从客户端证书获取CRL的URI(FSVO“通常”根据经验限制为来自GoDaddy和StartSSL.YMMV的证书),然后调用openssl CLI并刮掉结果。
几乎没有理想,但是除了编写一个新的PHP扩展之外,还没有找到另一种方法。