Добрый день, коллеги, возвращаясь к реализации подписи и проверки ЭЦП на сервере, я могу делать так?
0. При заключении договора нам присылают открытые ключи клиенты.
1. Пользователь входит сначала в лич кабинет через выданный нами логин пароль и подтверждает что он не робот (Google Captcha)
2. на странице PHP заполняет данные формы (POST) поля сообщения текст
3. Далее ниже кнопка обзора, пользователь выбирает файл-контейне PCSC12 (RSA256_bba3ff3629edcbc6b187a69d850dfeefeed64621.p12) и вводит пароль
3. На серверной части выполняется следующий код для выполнения подписи и проверки валидности подписи текста формы которую он заполнил и отправил нам (сохраняем в БД открытый ключ и подпись (для разборок))
Вопрос, такой вариант легален?
<?php
$keyfile = '/tmp/key/RSA256_bba3ff3629edcbc6b187a69d850dfeefeed64621.p12';
$filename = $keyfile;
$password = '123456';
$results = array();
$worked = openssl_pkcs12_read(file_get_contents($filename), $results, $password);
if ($worked) {
//echo '<pre>', print_r($results, true), '</pre>';
echo '</br>'.'<b>Сертификат: </b></br>'.$results['cert'].'</br>';
echo '</br>'.'<b>Закрытый ключ: </b></br>'.$results['pkey'].'</br>';
} else {
echo openssl_error_string();
}
$cert = $results['cert'];
//$pubkey = openssl_pkey_get_public("file://src/openssl-0.9.6/demos/sign/cert.pem");
$signature = '';
$data = 'Hi, how are you?';
$pkey = $results['pkey'];
echo '</br>'.'<b>Данные для подписи: </b></br>'.$data.'</br>';
$pkeyid = openssl_pkey_get_private($results['pkey']);
$worked = openssl_sign($data, $binary_signature, $pkey, "sha"); //"SHA256WITHRSA"
$sig = base64_encode($binary_signature);
echo '</br>'.'<b>Подпись: </b></br>'.$sig.'</br>';
$pubkey = openssl_pkey_get_public($cert);
$ok = openssl_verify($data, $binary_signature, $pubkey, "sha");
echo "check #1: ";
if ($ok == 1) {
echo "signature ok (as it should be)\n";
} elseif ($ok == 0) {
echo "bad (there's something wrong)\n";
} else {
echo "ugly, error checking signature\n";
}
?>