openssl_check_purpose()检查是否有撤销?

时间:2013-12-23 15:23:42

标签: php openssl x509

在检查(正确指定的)$ 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也不会自动检查撤销列表。

1 个答案:

答案 0 :(得分:0)

因此所有证据都指向“否”,并且openssl_ * API中似乎没有独立的函数来处理它。只要exec()没有被禁用,看起来你通常可以从客户端证书获取CRL的URI(FSVO“通常”根据经验限制为来自GoDaddy和StartSSL.YMMV的证书),然后调用openssl CLI并刮掉结果。

几乎没有理想,但是除了编写一个新的PHP扩展之外,还没有找到另一种方法。