如何通过CA';验证数字证书;的公钥


How to verify digital certificate by CA's public key

我正在研究PKI(公钥基础设施)中的数字证书。几乎所有与此相关的手册/页面都给出了以下类似的步骤。

  1. 获取使用者身份+使用者公钥(与使用者私钥进行AND/OR加密的消息哈希)并构建证书
  2. 使用CA的私钥对证书进行签名
  3. 在目的地,使用CA的公钥验证证书

现在,我能够在php(使用openssl-lib)中找到第一步和第二步的方法,它可以生成证书并通过opensslAPI对其进行签名(也可以生成签名哈希并对其进行签署)。

但第三步的问题是,它们没有显示如何用CA的公钥验证证书的指导线或函数调用。

如果我错过了什么?

示例代码I检查如下

$data = 'my data';
//create new private and public key
$req_key = openssl_pkey_new(array(
    "private_key_bits" => 2048,
    "private_key_type" => OPENSSL_KEYTYPE_RSA,
));
$dn = array(
                "countryName"            => "IN",
                "stateOrProvinceName"    => "Delhi",
                "organizationName"       => "example.net",
                "organizationalUnitName" => "Security",
                "commonName"             => "example.net"
                );
$req_csr  = openssl_csr_new ($dn, $req_key);
$req_cert = openssl_csr_sign($req_csr, null, $req_key, 365);
openssl_x509_export ($req_cert, $out_cert);
echo $out_cert;

背景:我需要为一些应用程序实现基于PKI的数据共享/验证。它将涉及一些数据实体(数据实体将有其公钥和私钥)在源端加密,然后发送到目的地。然后目的地解密并获得清晰的数据。但整个过程必须涉及PKI,这意味着数字签名+数字证书的实现。

这个任务在PHP中并不简单。事实上,PHP并不是实现CA的好工具。它支持基本的PKI操作,但仅此而已。我看到三个选项:

  1. X.509只是DER编码的ASN.1结构。例如,您可以使用guiDumpASN ng进行检查。PHP世界中也有一些ASN.1库。Basicaly,CA签名在证书中。如果你能够提取它,你就可以自己验证数字签名

http://php.net/manual/en/function.openssl-verify.php#98282

  1. 尝试使用像openssl-x509-checkpurpose这样的函数,它应该能够检查证书链。

  2. 尝试使用phpseclib-查看Validate X.509 certificates->validateSignature()。

我希望它能对你有所帮助。

不要搞砸自己实现证书验证,而是寻找CPV(证书路径验证)算法的实现,该算法包括证书链中需要执行的所有验证,其中证书签名验证只是其中之一。

现在,我一直在寻找一个PHP API来执行CPV,但我没有找到,所以我求助于从PHP执行以下外部OpenSSL命令:

exec("openssl verify -CAfile trusted_root_cas.pem -untrusted intermediate_cas.pem endentity_cert.pem", $output, $return_var);
if ($return_var == 0) {
    echo "Certification path validation completed successfully";
} else {
    echo "Certification path validation completed with errors";
}

其中,所有trusted_root_cas.pemintermediate_cas.pemendentity_cert.pem都可以是仅为执行上一个命令而创建的临时文件。

现在,如果您想知道openssl verify的作用,请执行man verify:

verify命令验证证书链。