Статистика

Участников проекта 105
Опубликовано статей 78
Отчет по карме. Топ 20

Новости блога

1 29.11.2013  Сегодня самым активным участникам newblog'а был выплачен доход с sape.
7 02.11.2012  Ура! Свешилось, нашему сайту дали тИЦ 10. Спасибо всем кто принимает участие в развитии нашего блога.
8 21.08.2012  Интеграция с sape.ru. Теперь каждый автор статей на newblog автоматически зарабатывает на рекламе.
Все новости

Топ 5 категорий

Программирование 46
Операционные системы 9
Базы данных 4
Туризм 2
Заметки 2

Последние 5 заметок (90)

gullyar - Закладки gullyar
gullyar - Ваша первая закладка
osadchaya - Закладки osadchaya
Ira0231188 - Закладки Ira0231188
Ira0231188 - Закладки Ira0231188

Ссылки

www.freedev.asia

php и электронно цифровая подпись (ЭЦП)

27.08.2012 19:06 | Просмотров: 11881 | Доход: 382.78 руб. | Комментариев: 14
[Программирование] 
Рейтинг: 4.33/3

Для начала немного терминологии:
ЭЦП(электронно цифровая подпись) - реквизит электронного документа, с помощью которого можно проверить отсутствие искажения информации с момента формирования ЭЦП и проверить принадлежность подписи владельцу сертификата ключа.
X.509 – стандарт, определяющий форматы данных и процедуры распределения открытых ключей с помощью сертификатов с цифровыми подписями, которые предоставляются сертификационными органами (CA).
PKCS#12 - стандарт семейства Public-Key Cryptography Standards(PKCS), определяет формат файла.
.p12 - файл-контейнер стандарта PKCS#12, защита файла осуществляется симметричным ключем, основанном на пароле
RSA - популярный криптографический алгоритм с открытым ключем используется для шифрования и ЭЦП (используется в PGP, SSL\TLS и т.д.)
SHA-1 - алгоритм криптографического хеширования. Генерирует дайджест, 160-ти битное хеш значение.
MD5 - алгоритм хеширования. Генерирует дайджест 128 бит.
ГОСТ Р 34.11-94 - Российский криптографический стандарт вычисления хеш функции, размер хеша - 256 бит.
ГОСТ Р 34.10-2001. "Информационная технология. Криптографическая защита информации. Процессы формирования и проверки электронной цифровой подписи" - стандарт, принятый в Российской Федерации. Разработан взамен ГОСТ Р 34.10-94. Используется для tls/ssl, в сертификатах открытых ключей и т.д.
ГОСТ 34.310-2004.- тоже что и ГОСТ P 34.10-2001, только в РК
При использовании ЭЦП подписывание производится закрытым ключем, а проверка - открым ключем.
Сертификат открытого ключа - сертификат ключа проверки электронной подписи, позволяет проверить информацию подписанную закрытым ключем, идентифицировать владельца. Содержит информацию о владельце, а также об УЦ и области применения ключа.
УЦ - удостоверяющий центр, открытый ключ которого известен всем участникам и его честность неоспорима. Основная задача - подтверждать подлинность ключей шифрования с помощью сертификатов ЭЦП. Грубо говоря УЦ подписывает ключи участников своим закрытым ключем.
Отозванный сертификат - если участник рассекретил свой закрытый ключ, то УЦ отзывает его сертификат и другие участники узнают что этому ключу доверять нельзя.
Самозаверенный сертификат - подписывается самим издателем, а не УЦ. Поэтому отозвать его невозможно. Не решает доверия к открытым ключам.
 
На Linux проще всего воспользоваться openssl, ставим:
apt-get install openssl
 
<?php
$link = fopen('rsa.p12', 'r');
$data = fread($file, filesize($link));
fclose($file);
openssl_pkcs12_read($data, $container, '***');
 
//получаю X.509 сертификат из контейнера p12
$cert=$container['cert'];
print_r($cert);
file_put_contents('cert.pem', $cert);
 
//получаю закрытый ключ
$privatekey = openssl_get_privatekey($container['pkey']);
print_r($privatekey);
file_put_contents('priv.key', $privatekey);
 
//получаю открытый ключ
$pubkey = openssl_pkey_get_public($container['cert']);
$keydata = openssl_pkey_get_details($pubkey);
print_r($keydata);  
...
?>

 
Формирование ЭЦП:
 
 <?php
...
$str='test';
//подписываю текст
openssl_sign($str, $signature, $privkey);
print_r($signature);
//освобождаем память от закрытого ключа
openssl_free_key($privkey);
...

 ?>

Проверка ЭЦП:
<?php
..
//проверяю ЭЦП
$ok = openssl_verify($str, $signature, $pubkey);
if ($ok == 1) {
    echo "ЭЦП корректна :)";
} else {
    echo "ЭЦП не корректна!";
}
//освобождаю память от открытого ключа
openssl_free_key($pubkey);
..
?>


© GM
| Комментировать статью |
  • Аноним 0 (30.01.2014 17:29)
    Очень полезная статья!!
    а вы можете поподробнее - как проверять квалифицированную ЭЦП (на отзыв, УЦ который выдал), получить из нее данные о клиенте, проверить цепочку сертификатов 
    и как подписывать документы загруженные на сервер
    
    Заранее благодарен за быстрый ответ
    
    ps готов оплатить консультацию mr[dot]mishgan(гав)gmail[dot]com
    | Ответить |
  • Аноним 0 (14.10.2014 18:38)
    Крайне полезная информация, + к карме автору ;)
    | Ответить |
  • EVOSandru6 0 (08.04.2015 09:48)
    Добрый день, почему print_r ничего не выводит? Используется реальная подпись, сформированная в цоне
    | Ответить |
    • GM +2587 (14.04.2015 18:23)
      включите вывод ошибок в коде:
      ini_set(\'error_reporting\', E_ALL);
      ini_set(\'display_errors\', 1);
      ini_set(\'display_startup_errors\', 1);
      скорее всего до print_r и не доходит дело..
      | Ответить |
      • Аноним 0 (04.06.2015 11:58)
        Вот начало:
        
        $link = fopen("egov/AUTH_RSA_323e170e6e7e9490b8b8daf5e01ad0620bc6a94d.p12", \'r\');
        $data = fread($file, filesize($link));
        
        Ругается так:
        
        Notice: Undefined variable: file in X:\home\sslecp\www\encode.php on line 35
        [Денвер: показать возможную причину ошибки]
        Warning: filesize() expects parameter 1 to be a valid path, resource given in X:\home\sslecp\www\encode.php on line 35
        
        Warning: fread() expects parameter 1 to be resource, null given in X:\home\sslecp\www\encode.php on line 35
        
        Notice: Undefined variable: file in X:\home\sslecp\www\encode.php on line 3
        Warning: filesize() expects parameter 1 to be a valid path, resource given in X:\home\sslecp\www\encode.php on line 3
        
        Warning: fread() expects parameter 1 to be resource, null given in X:\home\sslecp\www\encode.php on line 3
        
        
        Пробовал считывать и AUTH_RSA....p12 и просто RSA....p12, в обоих случаях такая ошибка возникает.
        | Ответить |
        • Аноним 0 (14.12.2015 15:38)
          Английским по белому написано же - "неизвестная переменная $file". У тебя есть переменная $link, вот она и должна быть первым аргументом к fread.
          | Ответить |
  • Sanzhar +2 (04.06.2015 13:58)
    Добрый день,подскажите как создать сертификат зная только privatekey и pubkey   
    | Ответить |
    • Аноним 0 (11.06.2015 15:53)
      https://toster.ru/q/223358
      | Ответить |
  • Sanzhar +2 (04.06.2015 14:07)
    уточнение имеется два файла  AUTH_RSA_c8c76480f557691ba0300f28798494479c808978.p12 и RSA_9a049a80cb78dec79add0d640954f0538fc09701.p12
    | Ответить |
    • Аноним 0 (22.06.2016 06:45)
      AUTH_RSA Это файл для выполнения авторизации через ЭЦП
      
      По законодательству файлом AUTH_RSA не должны быть подписаны документы соответственно через RSA_ не должен быть вход. 
      
      | Ответить |
  • Аноним 0 (13.07.2016 13:49)
    ДОбрый день. Помогите новичку разобраться с кодом. Непонятно в строке кода PHP "openssl_pkcs12_read($data, $container, \'***\');", что одержит переменная "$container". Спасибо.
    | Ответить |
  • Аноним 0 (23.08.2016 13:32)
    А как у вас с ГОСТ сертификатами обстоит дело в данном подходе?
    | Ответить |
  • Аноним 0 (25.12.2016 14:56)
    Сап. Получаю "file_put_contents(): supplied resource is not a valid stream resource" в строке, где формируется priv.key. Это можно как-то починить?
    | Ответить |
  • Аноним 0 (10.05.2017 11:14)
    Хотелось бы посмотреть на работу с сертификатами GOST. там все не так радужно.
    | Ответить |