2

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

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

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

谢谢。

4

3 回答 3

6

如果您只想检查私钥和证书是否匹配,则只需调用openssl_x509_check_private_key. 它以证书和私钥作为输入并返回它们是否匹配。看看这里的文档。

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

于 2013-09-24T14:13:28.277 回答
3

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

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

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

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

至于提取签名本身......你可以使用 phpseclib 。例如。

<?php
include('File/X509.php');

$x509 = new File_X509();
$cert = $x509->loadX509('...');

echo $cert['signature']
于 2013-09-25T14:59:15.240 回答
1

@Karthik:

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

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

于 2013-11-24T09:17:48.647 回答