Openssl x509 check private key: примеры (PHP)

Проверка соответствия приватного ключа сертификату X.509 в PHP
Раздел: Шифрование (OpenSSL)
openssl_x509_check_private_key(OpenSSLCertificate|string $certificate, OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key): bool
Описание функции openssl_x509_check_private_key

Функция openssl_x509_check_private_key в PHP выполняет проверку соответствия закрытого ключа сертификату X.509. Она используется при работе с криптографией, когда требуется убедиться, что конкретный приватный ключ соответствует открытому ключу, содержащемуся в сертификате.

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

Аргументы функции
  • certificate - принимает строку с PEM-кодированным сертификатом или ресурс типа OpenSSLCertificate (в PHP 8.0+).
  • private_key - принимает строку с PEM-кодированным приватным ключом или ресурс типа OpenSSLAsymmetricKey (в PHP 8.0+).

Функция возвращает логическое значение true при соответствии ключа сертификату, и false при несоответствии или возникновении ошибки.

Примеры использования openssl_x509_check_private_key
Базовый пример с PEM-строками
$cert = "-----BEGIN CERTIFICATE-----
...сертификат...
-----END CERTIFICATE-----";
$key = "-----BEGIN PRIVATE KEY-----
...ключ...
-----END PRIVATE KEY-----";

$result = openssl_x509_check_private_key($cert, $key);
echo 'Соответствие: ' . ($result ? 'да' : 'нет');
Соответствие: да
Пример с несоответствующими ключами
$cert = openssl_csr_sign(openssl_csr_new(['CN' => 'test'], $privKey1), null, $privKey2, 365);
$result = openssl_x509_check_private_key($cert, $privKey3);
var_dump($result);
bool(false)
Похожие функции в PHP

В PHP существует несколько функций для работы с сертификатами и ключами:

  • openssl_private_encrypt/openssl_public_decrypt - прямое шифрование и расшифровка для проверки соответствия через операции с данными
  • openssl_x509_parse - извлечение информации из сертификата без проверки ключа
  • openssl_pkey_get_private/openssl_pkey_get_public - получение ресурсов ключей для ручного сравнения параметров

Функция openssl_x509_check_private_key является специализированной для проверки соответствия, тогда как другие функции требуют больше шагов для аналогичной проверки.

Типичные ошибки использования
Некорректный формат ключа
$cert = 'некорректный сертификат';
$key = 'некорректный ключ';
$result = openssl_x509_check_private_key($cert, $key);
var_dump($result);
bool(false)
Использование ресурсов после обновления OpenSSL
// В PHP 8.0+ устаревшие ресурсы вызывают предупреждение
$cert = openssl_x509_read($pemCert); // возвращает OpenSSLCertificate
$key = openssl_pkey_get_private($pemKey); // возвращает OpenSSLAsymmetricKey
$result = openssl_x509_check_private_key($cert, $key);

В новых версиях PHP используется объектно-ориентированный подход вместо ресурсов.

Изменения в последних версиях PHP

В PHP 8.0 произошли значительные изменения типов параметров. Аргументы certificate и private_key теперь принимают объекты OpenSSLCertificate и OpenSSLAsymmetricKey соответственно, вместо ресурсов.

В PHP 8.1 добавлена более строгая типизация, функция теперь вызывает TypeError при передаче неверных типов аргументов.

Обновления в PHP 8.2 улучшили обработку ошибок для поврежденных ключей и сертификатов.

Расширенные примеры использования
Проверка ключа с паролем
Пример php
$encryptedKey = openssl_pkey_get_private($pemEncryptedKey, 'пароль');
$cert = openssl_x509_read($pemCert);
$result = openssl_x509_check_private_key($cert, $encryptedKey);
// Перед проверкой ключ должен быть расшифрован
Массовая проверка нескольких сертификатов
Пример php
$pairs = [
    ['cert' => $cert1, 'key' => $key1],
    ['cert' => $cert2, 'key' => $key2]
];

foreach ($pairs as $pair) {
    $valid = openssl_x509_check_private_key($pair['cert'], $pair['key']);
    echo 'Сертификат ' . ($valid ? 'валиден' : 'невалиден') . '\n';
}
Интеграция с веб-сервером
Пример php
// Проверка конфигурации SSL перед запуском сервера
$cert = file_get_contents('/path/to/cert.pem');
$key = file_get_contents('/path/to/key.pem');

if (!openssl_x509_check_private_key($cert, $key)) {
    throw new Exception('Несоответствие SSL сертификата и ключа');
}
// Запуск сервера с корректными SSL материалами
Аналоги в других языках программирования
Python (cryptography)
from cryptography import x509
from cryptography.hazmat.primitives import serialization

cert = x509.load_pem_x509_certificate(pem_cert.encode())
key = serialization.load_pem_private_key(pem_key.encode(), password=None)
public_key_cert = cert.public_key()
public_key_key = key.public_key()
result = public_key_cert.public_numbers() == public_key_key.public_numbers()
JavaScript (Node.js crypto)
const crypto = require('crypto');
const cert = new crypto.X509Certificate(pemCert);
const key = crypto.createPrivateKey(pemKey);
const publicKeyCert = cert.publicKey.export({type: 'spki', format: 'pem'});
const publicKeyKey = crypto.createPublicKey(key).export({type: 'spki', format: 'pem'});
const result = publicKeyCert === publicKeyKey;

PHP openssl_x509_check_private_key function comments

En
Openssl x509 check private key Checks if a private key corresponds to a certificate