Openssl get cert locations: примеры (PHP)

Получение путей сертификатов OpenSSL в PHP
Раздел: Шифрование (OpenSSL)
openssl_get_cert_locations: array
Обзор функции openssl_get_cert_locations

Функция openssl_get_cert_locations в PHP предоставляет информацию о расположении файлов и директорий, где OpenSSL ищет сертификаты по умолчанию.

Использование функции актуально при работе с криптографическими операциями, SSL/TLS соединениями, когда требуется понимание, откуда система берет корневые и доверенные сертификаты. Это полезно для диагностики проблем с SSL и настройки корректных путей к сертификатам.

Возвращаемое значение

Функция возвращает ассоциативный массив со следующими ключами:

  • default_cert_file — путь к файлу с сертификатами по умолчанию.
  • default_cert_file_env — имя переменной окружения, переопределяющей путь к файлу.
  • default_cert_dir — путь к директории с сертификатами по умолчанию.
  • default_cert_dir_env — имя переменной окружения для директории.
  • default_private_dir — директория для приватных ключей.
  • default_default_cert_area — базовый путь области сертификатов.
  • ini_cafile — значение из php.ini (openssl.cafile).
  • ini_capath — значение из php.ini (openssl.capath).
Простые примеры использования
Базовый вызов

Получение всех доступных путей:

<?php
$locations = openssl_get_cert_locations();
print_r($locations);
?>
Array
(
    [default_cert_file] => /usr/lib/ssl/cert.pem
    [default_cert_file_env] => SSL_CERT_FILE
    [default_cert_dir] => /usr/lib/ssl/certs
    [default_cert_dir_env] => SSL_CERT_DIR
    [default_private_dir] => /usr/lib/ssl/private
    [default_default_cert_area] => /usr/lib/ssl
    [ini_cafile] => 
    [ini_capath] => 
)
Использование с установленными ini-настройками
<?php
ini_set('openssl.cafile', '/custom/cafile.pem');
ini_set('openssl.capath', '/custom/certs/');
$locations = openssl_get_cert_locations();
echo $locations['ini_cafile']; // /custom/cafile.pem
echo $locations['ini_capath']; // /custom/certs/
?>
/custom/cafile.pem
/custom/certs/
Похожие функции в PHP

Прямых аналогов openssl_get_cert_locations в PHP нет, но существуют функции для работы с SSL контекстом и сертификатами.

  • stream_context_set_option — устанавливает опции для потокового контекста, включая SSL. Используют для тонкой настройки путей к сертификатам в конкретном соединении.
  • openssl_csr_get_subject, openssl_x509_parse — работают с содержимым сертификатов, но не с путями поиска. Предпочтительны для анализа данных сертификата.
  • Настройки в php.ini (openssl.cafile, openssl.capath) — глобальная альтернатива, влияющая на все SSL операции. Используют для централизованной настройки.

Функцию openssl_get_cert_locations применяют для диагностики, тогда как другие инструменты — для конкретных операций с сертификатами или установки путей.

Типичные ошибки
Ожидание аргументов

Функция не принимает аргументов, их передача вызовет ошибку.

<?php
$result = openssl_get_cert_locations('extra_arg');
?>
Warning: openssl_get_cert_locations() expects exactly 0 parameters, 1 given
Отсутствие расширения OpenSSL

При отключенном расширении openssl функция недоступна.

<?php
// Если расширение openssl не загружено
$locations = openssl_get_cert_locations();
?>
Fatal error: Uncaught Error: Call to undefined function openssl_get_cert_locations()
Неверная интерпретация путей

Пути в массиве могут не существовать в конкретной системе, что приводит к ошибкам SSL. Всегда проверяйте наличие файлов и директорий.

<?php
$locs = openssl_get_cert_locations();
if (!file_exists($locs['default_cert_file'])) {
    echo 'Файл сертификатов по умолчанию отсутствует';
}
?>
Файл сертификатов по умолчанию отсутствует
История изменений функции

Функция openssl get cert locations появилась в PHP 5.6.0. Значительных изменений в ее работе не было, но возвращаемый массив может дополняться новыми ключами в зависимости от версии OpenSSL.

В PHP 8.0.0 функция стабильна и полностью совместима с предыдущими версиями. В PHP 8.1.0 и 8.2.0 изменений не внесено.

Стоит учитывать, что содержимое массива зависит от сборки PHP и конфигурации OpenSSL на системе, поэтому между разными окружениями результаты могут отличаться.

Расширенные сценарии использования
Интеграция с кастомным хранилищем сертификатов
Пример php
<?php
// Получение системных путей
$sysPaths = openssl_get_cert_locations();

// Добавление кастомной директории к системным путям
$customCaPath = '/app/config/certs';
$effectiveCaPath = $sysPaths['default_cert_dir'] . ':' . $customCaPath;

// Установка для SSL контекста
$context = stream_context_create([
    'ssl' => [
        'verify_peer' => true,
        'cafile' => $sysPaths['ini_cafile'] ?: $sysPaths['default_cert_file'],
        'capath' => $effectiveCaPath,
    ]
]);

print_r($effectiveCaPath);
?>
/usr/lib/ssl/certs:/app/config/certs
Автоматическое создание отсутствующих директорий
Пример php
<?php
$locs = openssl_get_cert_locations();

foreach (['default_cert_dir', 'default_private_dir'] as $key) {
    if (!is_dir($locs[$key])) {
        mkdir($locs[$key], 0755, true);
        echo "Создана директория: {$locs[$key]}\n";
    }
}
?>
Создана директория: /usr/lib/ssl/certs
Создана директория: /usr/lib/ssl/private
Сравнение системных и ini настроек
Пример php
<?php
$l = openssl_get_cert_locations();

$report = [
    'cafile' => [
        'system_default' => $l['default_cert_file'],
        'ini_override' => $l['ini_cafile'],
        'effective' => $l['ini_cafile'] ?: $l['default_cert_file']
    ],
    'capath' => [
        'system_default' => $l['default_cert_dir'],
        'ini_override' => $l['ini_capath'],
        'effective' => $l['ini_capath'] ?: $l['default_cert_dir']
    ]
];

print_r($report);
?>
Array
(
    [cafile] => Array
        (
            [system_default] => /usr/lib/ssl/cert.pem
            [ini_override] => 
            [effective] => /usr/lib/ssl/cert.pem
        )

    [capath] => Array
        (
            [system_default] => /usr/lib/ssl/certs
            [ini_override] => 
            [effective] => /usr/lib/ssl/certs
        )

)
Использование в Docker окружении
Пример php
<?php
// В Docker-контейнере пути могут отличаться
$locations = openssl_get_cert_locations();

// Если ini_cafile не задан, используем системный, но проверяем его наличие
$cafile = $locations['ini_cafile'];
if (empty($cafile) && !file_exists($locations['default_cert_file'])) {
    // Пытаемся найти в альтернативных местах в контейнере
    $altPaths = [
        '/etc/ssl/certs/ca-certificates.crt',
        '/etc/pki/tls/cert.pem',
        '/etc/ssl/cert.pem'
    ];
    foreach ($altPaths as $path) {
        if (file_exists($path)) {
            $cafile = $path;
            break;
        }
    }
}

echo 'Используемый cafile: ' . ($cafile ?: 'не найден');
?>
Используемый cafile: /etc/ssl/certs/ca-certificates.crt
Аналоги в других языках

Openssl get cert locations в Python

Модуль ssl предоставляет функции для работы с SSL, но аналога openssl_get_cert_locations нет. Пути к сертификатам часто определяются через переменные окружения или параметры контекста.

import ssl
import certifi

# Путь к корневым сертификатам от certifi
print(certifi.where())

# Создание SSL контекста с кастомными путями
context = ssl.create_default_context(cafile='/path/to/cafile.pem')
print(context.cert_store_stats())
/usr/local/lib/python3.9/site-packages/certifi/cacert.pem
{'x509_ca': 135, 'x509': 135}
Node.js

В Node.js путь к корневым сертификатам определяется настройками OpenSSL в системе. Можно использовать process.env.NODE_EXTRA_CA_CERTS или опцию ca в HTTPS запросах.

const https = require('https');
const fs = require('fs');

// Опции для HTTPS с указанием CA
const options = {
  hostname: 'example.com',
  port: 443,
  path: '/',
  method: 'GET',
  ca: fs.readFileSync('/custom/ca.pem') // Указание кастомного CA
};

console.log('NODE_EXTRA_CA_CERTS:', process.env.NODE_EXTRA_CA_CERTS);
NODE_EXTRA_CA_CERTS: undefined

Openssl get cert locations в MySQL

В MySQL SSL настройки задаются при подключении клиента или в конфигурации сервера через параметры --ssl-ca, --ssl-capath. Прямого аналога функции получения путей нет.

PHP openssl_get_cert_locations function comments

En
Openssl get cert locations Retrieve the available certificate locations