openssl_spki_verify
(PHP 5 >= 5.6.0)
openssl_spki_verify — Verifies a signed public key and challenge
Описание
string openssl_spki_verify
( string
&$spkac
)Validates the supplied signed public key and challenge
Список параметров
-
spkac
-
Expects a valid signed public key and challenge
Возвращаемые значения
Returns a boolean on success or failure.
Ошибки
Emits an E_WARNING
level error if an invalid argument
is passed via the spkac
parameter.
Примеры
Пример #1 openssl_spki_verify() example
Validates an existing signed public key and challenge
<?php
$pkey = openssl_pkey_new('secret password');
$spkac = openssl_spki_new($pkey, 'challenge string');
if (openssl_spki_verify(preg_replace('/SPKAC=/', '', $spkac))) {
echo $spkac;
} else {
echo "SPKAC validation failed";
}
?>
Пример #2 openssl_spki_verify() example from <keygen>
Validates an existing signed public key and challenge issued from the <keygen> element
<?php
if (openssl_spki_verify(preg_replace('/SPKAC=/', '', $_POST['spkac']))) {
echo $spkac;
} else {
echo "SPKAC validation failed";
}
?>
<keygen name="spkac" challenge="challenge string" keytype="RSA">
Смотрите также
- openssl_spki_new() - Generate a new signed public key and challenge
- openssl_spki_export_challenge() - Exports the challenge assoicated with a signed public key and challenge
- openssl_spki_export() - Exports a valid PEM formatted public key signed public key and challenge
- openssl_md_method()
- openssl_csr_new() - Generates a CSR
- openssl_csr_sign() - Sign a CSR with another certificate (or itself) and generate a certificate
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Криптографические расширения
- OpenSSL
- openssl_cipher_iv_length
- openssl_csr_export_to_file
- openssl_csr_export
- openssl_csr_get_public_key
- openssl_csr_get_subject
- openssl_csr_new
- openssl_csr_sign
- openssl_decrypt
- openssl_dh_compute_key
- openssl_digest
- openssl_encrypt
- openssl_error_string
- openssl_free_key
- openssl_get_cert_locations
- openssl_get_cipher_methods
- openssl_get_md_methods
- openssl_get_privatekey
- openssl_get_publickey
- openssl_open
- openssl_pbkdf2
- openssl_pkcs12_export_to_file
- openssl_pkcs12_export
- openssl_pkcs12_read
- openssl_pkcs7_decrypt
- openssl_pkcs7_encrypt
- openssl_pkcs7_sign
- openssl_pkcs7_verify
- openssl_pkey_export_to_file
- openssl_pkey_export
- openssl_pkey_free
- openssl_pkey_get_details
- openssl_pkey_get_private
- openssl_pkey_get_public
- openssl_pkey_new
- openssl_private_decrypt
- openssl_private_encrypt
- openssl_public_decrypt
- openssl_public_encrypt
- openssl_random_pseudo_bytes
- openssl_seal
- openssl_sign
- openssl_spki_export_challenge
- openssl_spki_export
- openssl_spki_new
- openssl_spki_verify
- openssl_verify
- openssl_x509_check_private_key
- openssl_x509_checkpurpose
- openssl_x509_export_to_file
- openssl_x509_export
- openssl_x509_fingerprint
- openssl_x509_free
- openssl_x509_parse
- openssl_x509_read
Коментарии
This openssl_spki_* funcs are very usefull to use with <keygen/> tag in html5.
Example:
<?php
session_start();
// form submitted... (?)
if(isset($_POST['security']))
{
// If true, the send from <keygen/> is valid and you can
// test the challenge too
if(openssl_spki_verify($_POST['security']))
{
// Gets challenge string
$challenge = openssl_spki_export_challenge($_POST['security']);
// If true... you are not trying to trick it.
// If user open 2 windows to prevent data lost from a "mistake" or him just press "back" button
// and re-send last data... you can handle it using something like it.
if($challenge == $_SESSION['lastForm'])
{
echo 'Ok, this one is valid.', '<br><br>';
}
else
{
echo 'Nice try... nice try...', '<br><br>';
}
}
}
// If you open two window, the challenge won't match!
$_SESSION['lastForm'] = hash('md5', microtime(true));
?>
<!DOCTYPE html>
<html>
<body>
<form action="/index.php" method="post">
Encryption: <keygen name="security" keytype="rsa" challenge="<?php echo $_SESSION['lastForm']; ?>"/>
<input type="submit">
</form>
</body>
</html>
The challenge is not how to very a "trick". It is used as a partial non-repudiation method.
The idea was the challenge could be extracted from the base64 encoded ASN.1 PKCS#1 bits provided from the 'keygen' element.
The SPKAC is a form of CSR which if the right about of information such as the commonName, emailAddress, countryName, stateOrProvinceName, localityName et al., a signed x509 could generated and provided to the requestor.
This would then be installed in the browser and if the webserver was configured to accept client x509 certificates, it would be used in lieu of a password for authentication.
A recommendation was to use the 'challenge' as a form of non-repudiation in the event someone else was on your keyboard. If the application required it could prompt you for the challenge and compare it to a hashed version it stored upon the initial SPKAC process.
Hope that helps clear it up.