php работа с эцп
openssl_sign
(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)
openssl_sign — Генерация подписи
Описание
Список параметров
Строка данных, для которых вы хотите получить отпечаток
Строка, представляющая собой ключ в формате PEM
Целое число, определяющее алгоритм. Смотрите алгоритмы подписи.
Возвращаемые значения
Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.
Список изменений
Примеры
Пример #1 Пример использования openssl_sign()
// Извлекаем секретный ключ из файла и подготавливаем
$pkeyid = openssl_pkey_get_private ( «file://src/openssl-0.9.6/demos/sign/key.pem» );
Пример #2 Пример использования openssl_sign()
//Данные для генерации сигнатуры
$data = ‘my data’ ;
Смотрите также
User Contributed Notes 3 notes
This may help if you just want a real-simple private/public key pair:
= «Beeeeer is really good.. hic. » ;
// IMPORTANT: The key pair below is provided for testing only.
// For security reasons you must get a new key pair
// for production use, obviously.
The list of Signature Algorithms (constants) is very limited! Fortunately the newer versions of php/openssl allow you to specify the signature algorithm as a string.
You can use the ‘openssl_get_md_methods’ method to get a list of digest methods. Only some of them may be used to sign with RSA private keys.
Those that can be used to sign with RSA private keys are: md4, md5, ripemd160, sha, sha1, sha224, sha256, sha384, sha512
Как получить информацию о цифровой подписи из PDF с помощью PHP?
У меня есть приложение, которое должно получить некоторые данные (имя подписавшего) из цифровой подписи, «прикрепленной» к файлам PDF.
Я нашел только примеры в Java и C # с использованием класса AceFields класса iText GetSignatureNames
редактировать: я пробовал Pdftk с помощью dump_data_fields и generate_fpdf, и результат был (к сожалению):
Решение
Ну, это сложно (я бы даже сказал, невозможно, но кто знает) добиться этого только с помощью PHP.
Во-вторых, прочитав это, вы узнаете, что подпись хранится между байтами b и c согласно индикатору / ByteRange [a b c d].
В-третьих, мы можем извлечь b и c из документа, а затем извлечь саму подпись (руководство говорит, что это будет объект PKCS7 # с шестнадцатеричным кодированием).
В-четвертых, после третьего шага у нас есть объект PKCS # 7 в файле signature.pkcs7. К сожалению, я не знаю способов извлечения информации из подписи с использованием PHP. Таким образом, вы должны иметь возможность запускать команды оболочки для использования openssl
После выполнения этой команды в файле info.txt у вас будет цепочка сертификатов. Последний — тот, который вам нужен. Вы можете увидеть структуру файла и проанализировать необходимые данные.
РЕДАКТИРОВАТЬ в 2017-10-09
Я сознательно посоветовал вам увидеть именно этот вопрос
Существует код, который вы можете настроить в соответствии со своими потребностями.
Я настроил это для вас, но, пожалуйста, сделайте все остальное самостоятельно.
Другие решения
Я использовал iText и нашел его очень надежным, я очень рекомендую его.
Вы всегда можете вызвать Java-код как «микросервис» из PHP.
Встраивание электронной подписи в системы с WEB-интерфейсом с помощью браузерного плагина и openssl
Несколько лет назад нашей компанией был выпущен продукт Рутокен Плагин, который предназначен для встраивания электронной подписи в системы с web-интерфейсом. Основываясь на полученном опыте интеграции продукта в реальные проекты мне хочется отметить, что нередко разработчики для реализации серверной части предпочитают использовать поддерживающий российские криптоалгоритмы openssl.
В данной статье будет расписана типичная схема подобной интеграции, основанная на следующих сценариях использования плагина:
Данные сценарии предполагают клиент-серверное взаимодействие, написание клиентских скриптов на JavaScript и соответствующих им серверных вызовов openssl.
Подробности под катом.
Общие операции
Операции с устройством
Поиск подключенных устройств
Любой клиентский сценарий начинается с поиска подключенных к компьютеру USB-устройств Рутокен. В контексте данной статьи акцент делается на устройство Рутокен ЭЦП.
При этом возвращается список идентификаторов подключенных устройств. Идентификатор представляет собой число, связанное с номером слота, к которому подключено устройство. При повторном перечислении это число может отличаться для одного и того же устройства.
Рутокен Плагин определяет все подключенные к компьютеру USВ-устройства Рутокен ЭЦП, Рутокен PINPad, Рутокен WEB. Поэтому следующим шагом следует определить тип устройства.
Получение информации об устройстве
Для определения типа устройства следует использовать функцию getDeviceInfo с параметром TOKEN_INFO_DEVICE_TYPE. Значение этой константы содержится в объекте плагина.
Смена PIN-кода
Пример смены PIN-кода на устройстве:
Здесь первым параметром выступает старый PIN-код, а вторым новый PIN-код.
Работа с сертификатами
1. На токене могут храниться 3 категории сертификатов:
2. Для чтения сертификатов, хранящихся на устройстве, не требуется авторизация на устройство.
Пример чтения пользовательских сертификатов с устройства:
3. Сертификат можно экспортировать в PEM-формате:
Получится примерно такая строка:
4. Сертификат можно распарсить вызовом функции parseCertificate и получить из него DN Subject, DN Issuer, расширения, значение открытого ключа, подпись, серийный номер, срок действия и т.п.
5. Сертификат можно записать на устройство.
Пример записи сертификата на устройство как пользовательского:
6. Вызовом функции deleteCertificate можно удалить сертификат с токена.
Работа с ключевыми парами ГОСТ Р 34.10-2001
1. Для получения декрипторов ключевых пар, хранящихся на устройстве, требуется ввод PIN-кода. Следует понимать, что само значение закрытого ключ получено быть не может, так как ключ является неизвлекаемым.
Пример генерации ключевой пары ГОСТ Р 34.10-2001:
3. С помощью функции deleteKeyPair ключевая пара может быть удалена с токена.
Конфигурирование openssl
Openssl поддерживает российские криптоалгоритмы, начиная с версии 1.0. Для того, чтобы их использовать, в openssl требуется подгружать engine gost. В большинстве дистрибутивов openssl эта библиотека присутствует. Чтобы engine подгружалась, можно прописать ее в конфигурационном файле openssl:
Если конфигурационный файл openssl не расположен в стандартном месте, то путь к нему можно задать через переменную окружения OPENSSL_CONF.
Другим вариантом подгрузки engine gost является ее передача в параметрах командной строки утилиты openssl.
Если engine gost не расположена в стандартном месте, то через переменную окружения OPENSSL_ENGINES можно задать путь к директории, в которой openssl будет ее искать.
Для получения информации о том, успешен ли был вызов утилиты openssl или нет, с возможностью уточнения ошибки, требуется парсить stdout и stderror. В конце статьи приведена ссылка на PHP-скрипт, который использует данную утилиту.
Теперь перейдем к реализации законченных пользовательских сценариев.
Регистрация на портале
Сертификат выдается при регистрации в системе
Последовательность вызовов в клиентском скрипте будет следующей:
Далее запрос отправляется на сервер, где на его основе выдается сертификат.
Для этого на сервере должен быть установлен и правильно сконфигурирован openssl версии от 1.0 и развернут функционал УЦ.
1. Генерация улюча УЦ:
После этого в файле ca.key будет создан закрытый ключ
2. Создание самоподписанного сертификата УЦ:
После ввода необходимой информации об издателе в файле ca.crt будет создан сертификат УЦ.
Полученный от клиента запрос сохраняем в файл user.csr и выдаем на его основе сертификат (без модификации данных из запроса):
После этого в файле user.crt создается сертификат пользователя в PEM формате. Его следует отправить на клиент.
Дальнейшая последовательность вызовов на клиенте:
Сертификат уже имеется на токене, выдан внешним УЦ
Ключевая пара при этом должна быть создана в формате, совместимом с библиотекой rtPKCS11ECP для Рутокен ЭЦП.
Последовательность вызовов на клиенте:
Подпись получается в base64-формате. При проверке ее на сервере с помощью openssl подпись следует обрамить заголовками, чтобы сделать из нее PEM. Выглядеть подобная подпись будет примерно так:
Проверка подписи на сервере:
Здесь sign.cms — файл, в котором находится подпись, ca.crt — файл с корневыми сертификатами, до одного из которых должна выстроиться цепочка, data.file — файл, в который будет сохранены подписанные данные, user.crt — файл, в который будет сохранен пользовательский сертификат. Именно из data.file нужно извлечь данные отсоединить последние 32 символа и сравнить salt.
Если на сервере нужно получить информацию из сертификата, то парсить его можно так:
Показать содержимое сертификата в текстовом представлении:
Показать серийный номер сертификата:
Показать DN субъекта (subject):
Показать DN издателя:
Показать почтовый адрес субъекта:
Показать время начала действия сертификата:
Показать время окончания действия сертификата:
Строгая аутентификация на портале
Электронная подпись данных и/или файлов в формате CMS
Проверка подписи на сервере описана выше.
Шифрование/расшифрование данных и/или файлов в формате CMS
Шифрование данных на клиенте для сервера
Для того, чтобы обеспечить конфиденциальность обмена данными между клиентом и сервером в плагине предусмотрено шифрование/расшифрование данных. Данные шифруются в формате CMS. Для того, чтобы зашифровать данные в формате CMS, требуется сертификат открытого ключа «адресата». При этом расшифровать такое сообщение сможет только владелец закрытого ключа. При шифровании данных для сервера рекомендуется хранить сертификат сервера на Рутокен ЭЦП. Этот сертификат может быть записан на устройство при регистрации пользователя на портале. Для этого следует использовать функцию importCertificate, при этом в качестве параметра category следует передать CERT_CATEGORY_OTHER. Для использования в функции cmsEncrypt нужно получить тело сертификата по его дескриптору с помощью функции getCertificate. При этом дескриптор является уникальным и неизменным и может быть сохранен в учетной записи пользователя на сервере при импорте сертификата сервера. Для того, чтобы использовалось аппаратное шифрование по ГОСТ 28147-89, требуется установить опцию useHardwareEncryption в true. В противном случае будет использована быстрая программная реализация ГОСТ 28147-89.
Последовательность вызовов приведена на картинке:
Шифрование данных на клиенте:
Расшифрование данных на сервере, перед расшифрованием сообщение нужно обрамить PEM-заголовками «——BEGIN PKCS7——» и «——END PKCS7——«:
recipient.crt — сертификат того, для кого зашифровано сообщение, recipient.key — ключ того, для кого зашифровано сообщение.
Расшифрование данных, полученных с сервера, на клиенте
Для расшифрования данных, полученных с сервера, предназначена функция cmsDecrypt. Так как сервер шифрует для клиента, используя его сертификат, то в качестве keyId должен быть передан дескриптор закрытого ключа клиента, соответствующий открытому ключу в сертификате. Этот дескриптор является уникальным и неизменным и потому может быть сохранен в учетной записи пользователя на сервере. Кроме того, дескриптор ключа пользователя может быть получен явным образом, путем вызова функции getKeyByCertificate.
Шифрование данных на сервере для клиента:
Расшифрование данных на клиенте:
Полезные ссылки
Данные ссылки могут быть полезны разработчикам инфосистем с поддержкой ЭЦП на базе Рутокен Плагин и openssl:
Проверить электронную подпись в письме
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Подпись в письме
Кодом создаю Письмо: Dim dbMail As New NotesDatabase( «», «» ) Call dbMail.OpenMail() Set.
Как поставить в документе электронную подпись?
как поставить в документе электронную подпись, т.е. что бы при выводе документа на печать, на нем.
Inotes. Как Сделать Подпись В Письме Из Html Файла?
Добрый день! Есть сервер Domino 8.5.3FP2 на Linux. Клиент 8.5.3, почтовая база восмерочная.
Этим занимается криптопровайдер, поэтому проверка должна быть либо на сервере, либо локально после получения файла.
Либо после получения файла в письме на сервере. Но во всех случаях для проверки потребуется криптопровайдер.
Если нужна проверка на корректность, то можно воспользоваться библиотеками крипто-про https://cpdn.cryptopro.ru/
При проверке на соответствие необходимо иметь корректный сертификат пользователя у себя.
При локальной и ручной проверке, достаточно иметь криптопровайдер(рекомендую крипто-про)
Запутался в этих сертификатах. Выдала мне организация ЭЦП. Лежит он у меня на флешке. Как его прикрепить к письму и как человек проверит письмо, что это я подписал? Где тут сертификат?
Вы уж простите за глупые вопросы. Пощупать бы все руками )))
И ещё, говорят, что подобный модуль делается не на php, а на js. Это так?
Добавлено через 3 минуты
ЭЦП может быть просроченной, отозванной, заблокированной, но оригинальной.
ЭЦП Может быть не отозванной, не заблокированной, не просроченной, но несоответствующей ключам контейнера.
Если прям совсем ничего не понятно, то обратитесь в центр, они делают настройку и проводят консультацию бесплатно.
Взаимодействие можно сделать на любом языке.
Т.е. вам тупо нужно подписать и отправить файл. Это локальный файл для личного использования.
1. Устанавливаете криптопровайдер(программу)
2. Импортируете собственный сертификат (с помощью этой же программы или просто нажав на сертификат)
3. Импортируете сертификаты центра сертификации,/цепочку сертификатов. (этого может не потребоваться, смотря что за центр)
4. Подписываете файл (прям внутри этой программы, если новая версия, если старая то доп.средствами)
5. Отправляете адресату. Где он может проверить ЭЦП, имея программу-криптопровайдер у себя тоже.
В некоторых случаях этого не требуется.Например, если это Word,excel и т.д.
то проверку ЭЦП можно посмотреть прям в программе, без дополнительных. PDF тоже это умеет.
Но в большинстве случаев по доп файлу.
Я вижу только 2 варианта.
1. Формировать документ (письмо/содержимое письма) в виде файла и подписывать его на сервере, либо возвращать (загружать) на сервер от пользователя обратно, после того. как он подпишет у себя на пк. (технически самый простой вариант) но пользователи задолбят вопросами что как где и куда. Если их много и они меняются, то этот вариант отпадает.
Подписание документа должно включать в себя отправку как минимум открытого ключа(сертификат открытого ключа) пользователя на сервер с его сохранением, чтобы всегда можно было доказать соответствие ключа подписи, что вы не замешаны подделке. Что этот ключ принадлежит именно пользователю и он настоящий.
В большинстве случаев закон требует и логирование всех операций с документами и ЭЦП.
Погуглите для своей области. не могу знать.
вообще
Не до конца понятно. Если вы хотите подписывать соглашение о персональных данных на публичном зайте, область работы которого не регламентируется особыми правилами или законами, то ничего не нужно. просто галочки хватит. в этом случае на вас ответственность только за утечку или незаконное распространение данных.
Кейс: Подпись документов электронной подписью с помощью КриптоПро + PHP
Проблема
Именно с такой задачей к нам обратился регистратор ценных бумаг Сервис-реестр. Им этот функционал необходим как никому другому. Требовалось разработать механизм подписи электронных документов сразу двумя подписями, директора и бухгалтера. Мы не задумываясь взялись за эту задачу.
При общении с клиентом выяснилось, что предидущий подрядчик не справился с этой задачей. Мы очень удивились, ведь это был крупнейший разработчик и дистрибьютор программного обеспечения в России (по понятным причинам называть компанию мы не будем).
Реализация
Для реализации мы взяли за основу КриптоПро CSP. Далее дело техники и никакой магии. Установили на сервер КриптоПро и скомпилировали PHP расширение. При формировании документа создаются два файла подписей (директор и бухгалтер). Все три файла упаковываются в архив и отдаются на скачивание пользователю.
Результат и кому это будет полезно?
В результате заказчик получил именно тот функционал, которого и ожидал. Теперь эмитенты АО «Сервис-реестр» могут взаимодействовать с регистратором и получать юридически защищённые документы без необходимости физического присутствия или отправки/получения почтовой корреспонденции.
Такая функция будет востребована в любой организации работающей в b2b секторе. Сокращая бюрократические задержки, вы высвобождаете время своих сотрудников для решения более важных задач. Тем самым предоставляете более быстрый и современный сервис своим клиентам, что выгодно выделит вас на фоне конкурентов.
Реализация задачи Комзарев Алексей (программист IT-INFINITY).