当前位置: 首页 > 知识库问答 >
问题:

如何利用CA公钥验证数字证书

宁修永
2023-03-14

我正在研究公钥基础设施中的数字证书。几乎所有关于这方面的手册/页面都遵循类似的步骤。

  1. 获取受试者身份受试者公钥(和/或带有受试者私钥的加密消息哈希),并构建证书
  2. 使用CA的私钥签署证书
  3. 在目的地,使用CA的公钥验证证书

现在我能够找到方法在php(使用openssl lib)为第一和第二步,可以生成证书和签署它(可选地生成签名哈希和签署它太)通过openssl API。

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

如果我错过了什么?

我检查的示例代码如下所示

$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;

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

共有2个答案

岑毅庵
2023-03-14

不要搞砸自己实现证书验证的工作,而是寻找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中级。pemendentity_cert.pem可以是仅为执行上一个命令而创建的临时文件。

现在,如果您想知道openssl-verify的功能,请执行man-verify

verify命令验证证书链。

孙永嘉
2023-03-14

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

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

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

尝试使用openssl-x509-checkpurpose这样的函数来检查证书链。

尝试使用phpseclib-查看Validate X.509证书-

我希望这会对你有所帮助。

 类似资料:
  • 我的理解是公钥加密,私钥解密...有谁能帮我弄明白吗?

  • 通常情况下,访问远程服务器上的 Git 仓库要受到限制。你可能不希望任何人都能读取文件,或者至少不能改动文件吧。在这种情况下,进行有效的认证就是非常必要地。 你可能已经通过你所使用的浏览器了解了 “HTTPS” 协议,尽管它使用起来很简单,但是很多系统管理员还是会出于各种原因去选择使用更为普遍的 “SSH” 协议。在这种协议之下,当涉及到身份验证时,你就很可能需要 “SSH公钥”。 对于这种类型的

  • 我想知道如何使用公钥来验证私钥。 “<代码> <模数> 这是一个字符串,我试图使用Python验证它的私钥(也是作为字符串提供的)。我知道发行人和观众需要做什么,但我不确定如何处理所有这些信息。 我看了一些peoples使用各种包的例子,但我似乎不知道pub_key、private_key和message是什么类型...请帮帮我...我希望学习

  • 我需要用DSA公钥验证X509证书签名。我的证书文件x509.crt,我的DSA公钥在一个名为dsa_pub.key的文件中 我正试图为此使用openssl。我已经阅读了openssl验证文档,但在其中找不到任何有关DSA的参考。 当我运行以下命令时,我可以在证书中看到我的DSA公钥: 但是,在使用文件DSA_pub.key中的DSA公钥验证cert.crt时,我遇到了麻烦 如果您有任何建议,我将

  • 问题内容: 我有一个外部服务,在定义的事件发生后会给我回电,并用其私钥签署他的请求。 我已经存储了如下公钥: 因此,我的工作是通过验证签名来检查请求的内容是否未更改。 这是我的算法: 但是目前,我的算法已停止在此消息的“ PublicKey publicKey = keyFactory.generatePublic(publicKeySpec)”步骤处: 那么,如何以java api接受的方式加载