Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用php';s openssl_x509_解析_Php_Php Openssl - Fatal编程技术网

如何使用php';s openssl_x509_解析

如何使用php';s openssl_x509_解析,php,php-openssl,Php,Php Openssl,我正在使用php的OpenSSL函数(OpenSSL_x509_parse)解析给定站点的SSL证书信息。 示例代码: $stream = stream_context_create( array( "ssl" => array( "allow_self_signed" => true, "capture_peer_cert" => true, "capture_peer_cert_

我正在使用php的OpenSSL函数(OpenSSL_x509_parse)解析给定站点的SSL证书信息。 示例代码:

$stream = stream_context_create(
    array(
        "ssl" => array(
            "allow_self_signed" => true,
            "capture_peer_cert" => true,
            "capture_peer_cert_chain" => true,
            "verify_peer" => false,
            "verify_peer_name" => false,
            "sni_enabled" => true,
        ),
    )
);
$streamRead = @stream_socket_client("ssl://stackoverflow.com:443", $streamErrNo, $streamErrStr, 30, STREAM_CLIENT_CONNECT, $stream);
if (!$streamErrNo && $streamRead) {
    $streamContext = stream_context_get_params($streamRead);
    $streamContextMeta = stream_get_meta_data($streamRead);
    $certChainsRes = $streamContext["options"]["ssl"]["peer_certificate_chain"];
    $certChainArr = array();
    for ($i = 0; $i < count($certChainsRes); $i++) {
        $certChainData = openssl_x509_parse($certChainsRes[$i]);
        var_dump($certChainData);
    }
}
问题:

  • 1:我得到了signatureTypeSN、signatureTypeLN等详细信息,
    SignaturePenid但如何获取签名算法Id(哈希
    算法OID)如SHA256WithRSA加密=>1.2.840.113549.1.1.11

  • 2:这些详细信息显示证书的版本为2
    'version'=>int 2
    但浏览器显示证书版本为3

附:代码运行在带有php7.3的Ubuntu18.04服务器上。我使用的浏览器是Windows 10上的Mozilla Firefox。

1。版本 关于版本号(来自RFC:)

4.1.2.1。版本

此字段描述编码证书的版本。什么时候 正如此配置文件中所预期的那样,使用扩展时,版本必须为3 (值为2)。如果不存在扩展名,但存在唯一标识符 如果存在,则版本应为2(值为1);但是, 版本可能是3。如果仅存在基本字段,则版本 应为1(该值作为默认值从证书中省略 价值);但是,版本可能是2或3

实现应该准备好接受任何版本证书。 至少,一致性实现必须识别版本3 证书

用户不希望生成版本2证书 基于此概要文件的实现

这意味着输出中的版本2等于证书的版本3

2.老年人 关于问题的第一部分,最简单的方法是查找列表并将其实现为数组,然后进行普通替换。我在上找到了其中一个(搜索
oid=

同样在前面的RFC7427()中,您可以找到这些OID

array (size=16)
  'name' => string '/C=US/ST=NY/L=New York/O=Stack Exchange, Inc./CN=*.stackexchange.com' (length=68)
  'subject' => 
    array (size=5)
      'C' => string 'US' (length=2)
      'ST' => string 'NY' (length=2)
      'L' => string 'New York' (length=8)
      'O' => string 'Stack Exchange, Inc.' (length=20)
      'CN' => string '*.stackexchange.com' (length=19)
  'hash' => string '07cc7bb0' (length=8)
  'issuer' => 
    array (size=4)
      'C' => string 'US' (length=2)
      'O' => string 'DigiCert Inc' (length=12)
      'OU' => string 'www.digicert.com' (length=16)
      'CN' => string 'DigiCert SHA2 High Assurance Server CA' (length=38)
  'version' => int 2
  'serialNumber' => string '9833040086282421696121167723365753840' (length=37)
  'serialNumberHex' => string '0765C64E74E591D68039CA2A847563F0' (length=32)
  'validFrom' => string '181005000000Z' (length=13)
  'validTo' => string '190814120000Z' (length=13)
  'validFrom_time_t' => int 1538697600
  'validTo_time_t' => int 1565784000
  'signatureTypeSN' => string 'RSA-SHA256' (length=10)
  'signatureTypeLN' => string 'sha256WithRSAEncryption' (length=23)
  'signatureTypeNID' => int 668