php openssl:如何将私钥与证书相匹配

时间:2013-09-24 12:30:07

标签: php ssl https openssl ssl-certificate

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

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

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

感谢。

3 个答案:

答案 0 :(得分:5)

如果要做的只是检查私钥和证书是否匹配,您只需拨打openssl_x509_check_private_key即可。它将证书和私钥作为输入,并返回它们是否匹配。请查看文档here

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

答案 1 :(得分:3)

  

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

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

  

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

他们不应该匹配。查看phpseclib's X.509 parser并解码他们提供的示例证书。根级有三个部分。 tbsCertificate,signatureAlgorithm和signature。签名基于tbsCertificate。所以你想要一个tbsCertificate的签名来匹配所有三个字段组合的签名。这几乎永远不会发生。

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

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

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

echo $cert['signature']

答案 2 :(得分:1)

@Karthik:

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

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