Как получить OID алгоритма хэширования SSL-сертификата с помощью php openssl_x509_parse - PullRequest
0 голосов
/ 20 февраля 2019

Я использую 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);
    }
}

Код работает нормально, и он дает мне данные.Примеры данных.

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

Вопросы:

  • 1: я получаю такие сведения, как signatureTypeSN, signatureTypeLN,
    signatureTypeNID, но как получить идентификатор алгоритма подписи (хэш
    Алгоритм OID) например.sha256WithRSAEncryption => 1.2.840.113549.1.1.11

  • 2: эти данные показывают, что версия сертификата - 2 'version' => int 2, но браузер показывает, что версия сертификата - 3 ! [СкриншотСведения о сертификате SSL в браузере] 1

PS: код работает на сервере Ubuntu 18.04 с php7.3.Я использую браузер Mozilla Firefox для Windows 10.

1 Ответ

0 голосов
/ 24 февраля 2019

1.Версия

О номере версии (из RFC: https://tools.ietf.org/html/rfc5280#section-4.1.2.1)

4.1.2.1. Версия

В этом поле описывается версия закодированного сертификата. Когда расширенияиспользуется, как и ожидалось в этом профиле, версия ДОЛЖНА быть 3 (значение равно 2). Если расширения отсутствуют, но присутствует UniqueIdentifier, версия ДОЛЖНА быть 2 (значение равно 1), однаковерсия МОЖЕТ быть 3. Если присутствуют только основные поля, версия ДОЛЖНА быть 1 (значение в сертификате не указывается как значение по умолчанию), однако версия МОЖЕТ быть 2 или 3.

Реализации ДОЛЖНЫ бытьготов принять любой сертификат версии. Как минимум, соответствующие реализации ДОЛЖНЫ распознавать сертификаты версии 3.

Генерация сертификатов версии 2 не ожидается реализациями, основанными на этом профиле.

Itозначает, что версия 2 в выводе равна версии сертификата 3.

2. OID

Что касается первой части вопроса, самый простой способ - этоnd список и реализовать его как массив, а затем заменить.Один из них я нашел в https://tools.ietf.org/html/rfc7427 (поиск oid =)

Также в предыдущем RFC 7427 (https://tools.ietf.org/html/rfc5280) Вы можете найти эти OID

...