Openssl spki export: примеры (PHP)
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-----"
$spkac = 'MIICUTCCASswgg...BASE64_DATA...';
$publicKey = openssl_spki_export($spkac);
echo $publicKey ? 'Успех' : 'Ошибка';Успех
Похожие функции в PHP
Извлекает challenge из структуры SPKAC. Используется совместно с openssl_spki_export для получения полной информации.
Создает новый SPKAC, используя приватный ключ и challenge. Является обратной операцией.
Проверяет подпись SPKAC. Рекомендуется вызывать перед извлечением ключа для проверки целостности.
Типичные ошибки
$result = openssl_spki_export('invalid_data');
var_dump($result);bool(false)
// При отключенном расширении 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
Удален второй параметр $challenge. Для извлечения challenge теперь используется отдельная функция openssl_spki_export_challenge().
Добавлена поддержка параметра $challenge для извлечения данных вызова из SPKAC.
Расширенные примеры
$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);$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";// Чтение 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);// Обработка данных из формы
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$spkac = $_POST['spkac'] ?? '';
if (openssl_spki_verify($spkac)) {
$publicKey = openssl_spki_export($spkac);
// Сохранение ключа в базу данных или файл
save_public_key($publicKey);
}
}<form method="post">
<!-- В реальном сценарии генерируется JavaScript -->
<input type="hidden" name="spkac" id="spkac">
<button type="button" onclick="generateKey()">Сгенерировать ключ</button>
<input type="submit" value="Отправить">
</form>Альтернативы в других языках
В 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);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 spkac -in challenge.spkac -pubkey -noout