Openssl spki export: примеры (PHP)

Работа с openssl_spki_export: извлечение публичных ключей
Раздел: Шифрование (OpenSSL)
openssl_spki_export(string $spki): string|false

Функция openssl_spki_export

Функция openssl_spki_export извлекает открытый ключ в формате PEM из структуры SPKAC (Signed Public Key and Challenge). Эта структура часто используется в веб-технологиях, например, в элементах HTML <keygen> (устаревший) или при работе с клиентскими сертификатами.

Аргументы функции

Функция принимает один обязательный параметр:

  • spkac - строка, содержащая структуру SPKAC. Может быть чистым Base64-кодированным выводом или строкой с префиксом 'SPKAC='. С версии PHP 8.0.0 функция принимает только этот параметр.
Возвращаемое значение

Возвращает открытый ключ в формате PEM или false при возникновении ошибки.

Примеры использования

Базовое извлечение ключа
$spkac = 'SPKAC=MIICUTCCASswgg...BASE64_DATA...';
$publicKey = openssl_spki_export($spkac);
var_dump($publicKey);
string(451) "-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzQ...
-----END PUBLIC KEY-----"
Обработка Base64 без префикса
$spkac = 'MIICUTCCASswgg...BASE64_DATA...';
$publicKey = openssl_spki_export($spkac);
echo $publicKey ? 'Успех' : 'Ошибка';
Успех

Похожие функции в PHP

Извлекает challenge из структуры SPKAC. Используется совместно с openssl_spki_export для получения полной информации.

Создает новый SPKAC, используя приватный ключ и challenge. Является обратной операцией.

Проверяет подпись SPKAC. Рекомендуется вызывать перед извлечением ключа для проверки целостности.

Типичные ошибки

Неверный формат SPKAC
$result = openssl_spki_export('invalid_data');
var_dump($result);
bool(false)
Отсутствие расширения OpenSSL
// При отключенном расширении openssl
Fatal error: Uncaught Error: Call to undefined function openssl_spki_export()
Попытка использовать удаленный параметр
// В PHP 8+ вызовет ошибку
$key = openssl_spki_export($spkac, $challenge);
Fatal error: Uncaught ArgumentCountError: Too many arguments

Изменения в версиях PHP

PHP 8.0.0

Удален второй параметр $challenge. Для извлечения challenge теперь используется отдельная функция openssl_spki_export_challenge().

PHP 7.0.0

Добавлена поддержка параметра $challenge для извлечения данных вызова из SPKAC.

Расширенные примеры

Полная обработка SPKAC с проверкой
Пример php
$spkac = 'SPKAC=MIICUTCCASswgg...';

// Проверка подписи
if (!openssl_spki_verify($spkac)) {
die('Неверная подпись SPKAC');
}

// Извлечение ключа
$publicKey = openssl_spki_export($spkac);
if ($publicKey === false) {
die('Ошибка извлечения ключа');
}

// Извлечение challenge
$challenge = openssl_spki_export_challenge($spkac);

echo 'Публичный ключ: ' . htmlspecialchars($publicKey) . "\n";
echo 'Challenge: ' . htmlspecialchars($challenge);
Конвертация ключа в другие форматы
Пример php
$spkac = '...';
$pemKey = openssl_spki_export($spkac);

// Создание ресурса ключа
$keyResource = openssl_pkey_get_public($pemKey);

// Извлечение деталей ключа
$details = openssl_pkey_get_details($keyResource);
echo 'Тип ключа: ' . $details['type'] . "\n";
echo 'Биты: ' . $details['bits'] . "\n";
Работа с файловой системой
Пример php
// Чтение SPKAC из файла
$spkac = file_get_contents('client.spkac');
$publicKey = openssl_spki_export($spkac);

// Сохранение ключа в файл
file_put_contents('public_key.pem', $publicKey);

// Создание самоподписанного сертификата
$privKey = openssl_pkey_new(['private_key_bits' => 2048]);
$csr = openssl_csr_new([], $privKey);
$cert = openssl_csr_sign($csr, null, $privKey, 365);

openssl_x509_export($cert, $certPem);
file_put_contents('certificate.pem', $certPem);
Интеграция с веб-формами
Пример php
// Обработка данных из формы
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$spkac = $_POST['spkac'] ?? '';
if (openssl_spki_verify($spkac)) {
$publicKey = openssl_spki_export($spkac);
// Сохранение ключа в базу данных или файл
save_public_key($publicKey);
}
}
Пример HTML формы
Пример php
<form method="post">
<!-- В реальном сценарии генерируется JavaScript -->
<input type="hidden" name="spkac" id="spkac">
<button type="button" onclick="generateKey()">Сгенерировать ключ</button>
<input type="submit" value="Отправить">
</form>

Альтернативы в других языках

JavaScript (браузерный API)

В JavaScript аналогом является работа с CryptoKey через Web Crypto API. Прямого аналога нет, но можно экспортировать ключи:

// Генерация и экспорт ключа
const keyPair = await crypto.subtle.generateKey(
{ name: "RSA-PSS", modulusLength: 2048 },
true, ["sign"]
);
const exported = await crypto.subtle.exportKey("spki", keyPair.publicKey);
Python (cryptography)
from cryptography.hazmat.primitives import serialization
# Загрузка PEM ключа
with open("public.pem", "rb") as f:
public_key = serialization.load_pem_public_key(f.read())
# Экспорт в формате DER (аналог SPKI)
der = public_key.public_bytes(
encoding=serialization.Encoding.DER,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
OpenSSL CLI
openssl spkac -in challenge.spkac -pubkey -noout

PHP openssl_spki_export function comments

En
Openssl spki export Exports a valid PEM formatted public key signed public key and challenge