2015-10-28 54 views
3

我正在研究PKI(公钥基础结构)中的数字证书。几乎所有关于此的手册/页面都给出了类似的步骤。如何通过CA公钥验证数字证书

  1. 获取主题标识+主题公钥(和/或加密的邮件哈希与主题的私钥)并构建证书。
  2. 与CA与私钥
  3. 目的地,验证证书注册证书CA的公钥

现在我能找到(使用OpenSSL的LIB)在PHP的方式为第1和第2步,可以产生一个证书并通过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; 

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

+0

你能澄清你想要做什么吗?您的问题现在读取的方式,听起来像是您将密钥交换的概念与证书验证混合在一起。证书验证是一个单独的问题。验证完全取决于受信任的根证书颁发机构的概念,该概念建立了一个链,用于从服务器证书返回给受信任的授权机构。 –

+0

@TechnikEmpire,我添加了一些问题的背景 –

回答

0

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

  1. X.509是DER编码的ASN.1结构。例如,您可以使用guiDumpASN-ng进行检查。 PHP世界中也有一些ASN.1库。基本上,CA签名是在证书内。如果您能够提取它,则可以自行验证数字签名。

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

  • 尝试使用函数像openssl-x509-checkpurpose应该能够检查certificate chain

  • 尝试使用phpseclib - 查看Validate X.509证书 - > validateSignature()。

  • 我希望它能帮助你一点点。

    0

    不要乱用自己执行证书验证,但寻找的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.pemintermediate_cas.pemendentity_cert.pem可能是为执行前一个命令而创建的临时文件。现在

    ,如果你想知道什么呢openssl verify,执行man verify

    的验证命令验证证书链。