我有一个自签名签名,其中包含证书本身和私钥。我的目的是检查此私钥是否与证书匹配。我的工作如下:
$private = openssl_pkey_get_private("path/to/certificate");
$public = openssl_pkey_get_public("path/to/certificate");
openssl_sign("path/to/certificate", $sig, $private);
所以我根据文件中的私钥和公钥创建签名。所以我需要做的是将此签名与证书中的现有签名进行比较。如果它们匹配,则表示私钥匹配。但是,我无法从文件中检索现有的签名信息。我想知道我的方式是否正确,因为我没有找到关于谷歌的信息。
感谢。
答案 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上的代码添加到