我正在研究PKI(公钥基础设施)中的数字证书。几乎所有与此相关的手册/页面都给出了以下类似的步骤。
- 获取使用者身份+使用者公钥(与使用者私钥进行AND/OR加密的消息哈希)并构建证书
- 使用CA的私钥对证书进行签名
- 在目的地,使用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操作,但仅此而已。我看到三个选项:
- X.509只是DER编码的ASN.1结构。例如,您可以使用guiDumpASN ng进行检查。PHP世界中也有一些ASN.1库。Basicaly,CA签名在证书中。如果你能够提取它,你就可以自己验证数字签名
http://php.net/manual/en/function.openssl-verify.php#98282
-
尝试使用像openssl-x509-checkpurpose这样的函数,它应该能够检查证书链。
-
尝试使用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.pem
、intermediate_cas.pem
和endentity_cert.pem
都可以是仅为执行上一个命令而创建的临时文件。
现在,如果您想知道openssl verify
的作用,请执行man verify
:
verify命令验证证书链。