PHP OpenSSL:如何将私钥与证书匹配


php openssl: how to match the private key with the certificate

>我有一个自签名,其中包含证书本身和私钥。我的目的是检查此私钥是否与证书匹配。我所做的如下:

$private = openssl_pkey_get_private("path/to/certificate");
$public  = openssl_pkey_get_public("path/to/certificate");
openssl_sign("path/to/certificate", $sig, $private);

因此,我根据文件中的私钥和公钥创建签名。所以我需要做的是将此签名与证书中的现有签名进行比较。如果它们匹配,则表示私钥匹配。但是,我无法从文件中检索现有的签名信息。我想知道我的方式是否是一种正确的方法,因为我在谷歌上没有找到任何信息。

谢谢。

如果您只想检查私钥和证书是否匹配,您可以直接调用 openssl_x509_check_private_key 。它接受证书和私钥作为输入,并返回它们是否匹配。请在此处查看文档。

编辑:另请注意,证书中的签名是使用组成证书的不同信息到达的,而您传递给openssl_sign函数的数据只是证书的路径。因此,即使您最终确定了从证书中提取签名的方法,它仍然不会与openssl_sign的输出匹配(绝对不是您传递给openssl_sign的$data(。

我有一个自签名,其中包含证书本身和私钥。我的目的是检查此私钥是否与证书匹配。我所做的如下:

证书不包含私钥。只是公钥。它们由私钥签名(在自签名证书的情况下,私钥是对应于证书中包含的公钥的私钥(,但它们不包含私钥。

所以我需要做的是将此签名与证书中的现有签名进行比较。如果它们匹配,则表示私钥匹配。

它们永远不应该匹配。查看phpseclib的X.509解析器并解码他们提供的示例证书。根级别有三个部分。tbs证书、签名算法和签名。签名基于 tbs证书。因此,您希望 tbsCertificate 的签名与所有三个字段组合的签名匹配。这几乎永远不会发生。

至于提取签名本身...你可以使用 phpseclib 来实现这一点。例如。

<?php
include('File/X509.php');
$x509 = new File_X509();
$cert = $x509->loadX509('...');
echo $cert['signature']

>@Karthik:

非常感谢您指向 http://badpenguins.com/source/misc/isCertSigner.php?viewSource 的指针。遗憾的是,openssl-php 库缺少 extractSignature 函数。

我将 http://badpenguins.com/source/misc/isCertSigner.php 上的代码添加到

  • 我的简单证书查看器 (PHP( https://github.com/Wikinaut/MySimpleCertificateViewer .