эцп на сайте 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

Источник

Кейс: Подпись документов электронной подписью с помощью КриптоПро + PHP

эцп на сайте php. Смотреть фото эцп на сайте php. Смотреть картинку эцп на сайте php. Картинка про эцп на сайте php. Фото эцп на сайте php

Проблема

Именно с такой задачей к нам обратился регистратор ценных бумаг Сервис-реестр. Им этот функционал необходим как никому другому. Требовалось разработать механизм подписи электронных документов сразу двумя подписями, директора и бухгалтера. Мы не задумываясь взялись за эту задачу.

При общении с клиентом выяснилось, что предидущий подрядчик не справился с этой задачей. Мы очень удивились, ведь это был крупнейший разработчик и дистрибьютор программного обеспечения в России (по понятным причинам называть компанию мы не будем).

Реализация

Для реализации мы взяли за основу КриптоПро CSP. Далее дело техники и никакой магии. Установили на сервер КриптоПро и скомпилировали PHP расширение. При формировании документа создаются два файла подписей (директор и бухгалтер). Все три файла упаковываются в архив и отдаются на скачивание пользователю.

эцп на сайте php. Смотреть фото эцп на сайте php. Смотреть картинку эцп на сайте php. Картинка про эцп на сайте php. Фото эцп на сайте php

Результат и кому это будет полезно?

В результате заказчик получил именно тот функционал, которого и ожидал. Теперь эмитенты АО «Сервис-реестр» могут взаимодействовать с регистратором и получать юридически защищённые документы без необходимости физического присутствия или отправки/получения почтовой корреспонденции.

Такая функция будет востребована в любой организации работающей в b2b секторе. Сокращая бюрократические задержки, вы высвобождаете время своих сотрудников для решения более важных задач. Тем самым предоставляете более быстрый и современный сервис своим клиентам, что выгодно выделит вас на фоне конкурентов.

Реализация задачи Комзарев Алексей (программист IT-INFINITY).

Источник

Встраивание электронной подписи в системы с WEB-интерфейсом с помощью браузерного плагина и openssl

эцп на сайте php. Смотреть фото эцп на сайте php. Смотреть картинку эцп на сайте php. Картинка про эцп на сайте php. Фото эцп на сайте php

Несколько лет назад нашей компанией был выпущен продукт Рутокен Плагин, который предназначен для встраивания электронной подписи в системы с 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-скрипт, который использует данную утилиту.

Теперь перейдем к реализации законченных пользовательских сценариев.

Регистрация на портале

Сертификат выдается при регистрации в системе

Последовательность вызовов в клиентском скрипте будет следующей:

эцп на сайте php. Смотреть фото эцп на сайте php. Смотреть картинку эцп на сайте php. Картинка про эцп на сайте php. Фото эцп на сайте php

Далее запрос отправляется на сервер, где на его основе выдается сертификат.
Для этого на сервере должен быть установлен и правильно сконфигурирован openssl версии от 1.0 и развернут функционал УЦ.

1. Генерация улюча УЦ:

После этого в файле ca.key будет создан закрытый ключ

2. Создание самоподписанного сертификата УЦ:

После ввода необходимой информации об издателе в файле ca.crt будет создан сертификат УЦ.

Полученный от клиента запрос сохраняем в файл user.csr и выдаем на его основе сертификат (без модификации данных из запроса):

После этого в файле user.crt создается сертификат пользователя в PEM формате. Его следует отправить на клиент.
Дальнейшая последовательность вызовов на клиенте:

эцп на сайте php. Смотреть фото эцп на сайте php. Смотреть картинку эцп на сайте php. Картинка про эцп на сайте php. Фото эцп на сайте php

Сертификат уже имеется на токене, выдан внешним УЦ

Ключевая пара при этом должна быть создана в формате, совместимом с библиотекой rtPKCS11ECP для Рутокен ЭЦП.

Последовательность вызовов на клиенте:
эцп на сайте php. Смотреть фото эцп на сайте php. Смотреть картинку эцп на сайте php. Картинка про эцп на сайте php. Фото эцп на сайте php

Подпись получается в 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.

Последовательность вызовов приведена на картинке:

эцп на сайте php. Смотреть фото эцп на сайте php. Смотреть картинку эцп на сайте php. Картинка про эцп на сайте php. Фото эцп на сайте php

Шифрование данных на клиенте:

Расшифрование данных на сервере, перед расшифрованием сообщение нужно обрамить PEM-заголовками «——BEGIN PKCS7——» и «——END PKCS7——«:

recipient.crt — сертификат того, для кого зашифровано сообщение, recipient.key — ключ того, для кого зашифровано сообщение.

Расшифрование данных, полученных с сервера, на клиенте

Для расшифрования данных, полученных с сервера, предназначена функция cmsDecrypt. Так как сервер шифрует для клиента, используя его сертификат, то в качестве keyId должен быть передан дескриптор закрытого ключа клиента, соответствующий открытому ключу в сертификате. Этот дескриптор является уникальным и неизменным и потому может быть сохранен в учетной записи пользователя на сервере. Кроме того, дескриптор ключа пользователя может быть получен явным образом, путем вызова функции getKeyByCertificate.

Шифрование данных на сервере для клиента:

Расшифрование данных на клиенте:

Полезные ссылки

Данные ссылки могут быть полезны разработчикам инфосистем с поддержкой ЭЦП на базе Рутокен Плагин и openssl:

Источник

Подпись по ГОСТ в php?

Добавил в OpenSSL GOST Engine, проверил

Выпустил самоподписанный сертификат и закрытый ключ по ГОСТу 2012 256 бит, задал пароль

Пытаюсь пописать строку через openssl_sign

эцп на сайте php. Смотреть фото эцп на сайте php. Смотреть картинку эцп на сайте php. Картинка про эцп на сайте php. Фото эцп на сайте php

эцп на сайте php. Смотреть фото эцп на сайте php. Смотреть картинку эцп на сайте php. Картинка про эцп на сайте php. Фото эцп на сайте php

эцп на сайте php. Смотреть фото эцп на сайте php. Смотреть картинку эцп на сайте php. Картинка про эцп на сайте php. Фото эцп на сайте php

эцп на сайте php. Смотреть фото эцп на сайте php. Смотреть картинку эцп на сайте php. Картинка про эцп на сайте php. Фото эцп на сайте php

эцп на сайте php. Смотреть фото эцп на сайте php. Смотреть картинку эцп на сайте php. Картинка про эцп на сайте php. Фото эцп на сайте php

эцп на сайте php. Смотреть фото эцп на сайте php. Смотреть картинку эцп на сайте php. Картинка про эцп на сайте php. Фото эцп на сайте php

эцп на сайте php. Смотреть фото эцп на сайте php. Смотреть картинку эцп на сайте php. Картинка про эцп на сайте php. Фото эцп на сайте php

эцп на сайте php. Смотреть фото эцп на сайте php. Смотреть картинку эцп на сайте php. Картинка про эцп на сайте php. Фото эцп на сайте php

irishmann, Так же обратите внимание, установлена ли переменная OPENSSL_CONF

PHP will search for the openssl.cnf using the following logic:

the OPENSSL_CONF environmental variable, if set, will be used as the path (including filename) of the configuration file.
the SSLEAY_CONF environmental variable, if set, will be used as the path (including filename) of the configuration file.
The file openssl.cnf will be assumed to be found in the default certificate area, as configured at the time that the openssl DLL was compiled. This is usually means that the default filename is C:\Program Files\Common Files\SSL\openssl.cnf (x64) or C:\Program Files (x86)\Common Files\SSL\openssl.cnf (x86), or, prior to PHP 7.4.0, C:\usr\local\ssl\openssl.cnf.

эцп на сайте php. Смотреть фото эцп на сайте php. Смотреть картинку эцп на сайте php. Картинка про эцп на сайте php. Фото эцп на сайте php

эцп на сайте php. Смотреть фото эцп на сайте php. Смотреть картинку эцп на сайте php. Картинка про эцп на сайте php. Фото эцп на сайте php

Korya, конфиг залил в облако. При перезапуске сервера, скрипт выдает ошибки

При следующем старте скрипта они пропадают.

эцп на сайте php. Смотреть фото эцп на сайте php. Смотреть картинку эцп на сайте php. Картинка про эцп на сайте php. Фото эцп на сайте php

С OpenSSL ничего не вышло. Сделал с помощью КриптоПРО. Поставил CSP на сервер, установил сертификаты и собрал расширение phpcades. Ниже говнокод, ссылки на примеры и инструкции.

Источник

Как на PHP проверить подпись PKCS7?

С помощью CryproPro Browser Plugin подписываем данные (данные в подпись не включаются) и передаем данные и подпись на сервер. Как на backend’е с помощью PHP проверить подпись?

Тестовый пример:
Подписываемые данные:
MTIz

Подпись:
MIIHrwYJKoZIhvcNAQcCoIIHoDCCB5wCAQExDDAKBgYqhQMCAgkFADALBgkqhkiG9w0BBwGgggWO
MIIFijCCBTmgAwIBAgIKFa5nHQAAAAAAEzAIBgYqhQMCAgMwVzELMAkGA1UEBhMCUlUxSDBGBgNV
BAMTP0NlbnRlci1JbmZvcm0gVGVzdCBHb3N0IENBIGZvciBBdXRvbWF0ZWQgQ2VydGlmaWNhdGlv
biBTZXJ2aWNlczAeFw0xNjA0MjkxMTU2MDBaFw0xNjA1MjkxMjA2MDBaMIICATEYMBYGCCqFAwOB
DQEBEgo3ODI3MDEwMDAwMRYwFAYFKoUDZAMSCzE0MTQ2NTk0NDYwMRgwFgYFKoUDZAESDTEwMzc4
MDAwMDY1MjkxGjAYBggqhQMDgQMBARIMMDAwMDAwMDAwMDAwMSgwJgYJKoZIhvcNAQkBFhlrLnZh
Z25lckBjZW50ZXItaW5mb3JtLnJ1MQswCQYDVQQGEwJSVTEtMCsGA1UECAwkNzgg0LMuINCh0LDQ
vdC60YIt0J/QtdGC0LXRgNCx0YPRgNCzMQowCAYDVQQHDAEwMTMwMQYDVQQKDCrQntCe0J4gIjEy
0KLQtdGB0YLQvtCy0LDRjyDQktCw0LPQvdC10YAxMiIxCjAIBgNVBAsMATAxMzAxBgNVBAMMKtCe
0J7QniAiMTLQotC10YHRgtC+0LLQsNGPINCS0LDQs9C90LXRgDEyIjEKMAgGA1UECQwBMDEwMC4G
CSqGSIb3DQEJAgwhMDAwMDAwMDAwMC03ODA0MDEwMTItNzAxNzA4OTAzMzA3MSwwKgYDVQQMDCPQ
ktC10LTRg9GJ0LjQuSDRgdC/0LXRhtC40LDQu9C40YHRgjEsMCoGA1UEKgwj0JrRgdC10L3QuNGP
INCT0YDQuNCz0L7RgNGM0LXQstC90LAxFTATBgNVBAQMDNCS0LDQs9C90LXRgDBjMBwGBiqFAwIC
EzASBgcqhQMCAiQABgcqhQMCAh4BA0MABEDQ+qVSBmQT0pLQktgaiF4eYRhHCkj4dgysTY6yGwqY
f3YO5ErwQEP551bi2cUWSAD56nUtMCmRSVdm/LTwXNgvo4ICNzCCAjMwDgYDVR0PAQH/BAQDAgTw
MFYGA1UdJQRPME0GCCsGAQUFBwMCBggrBgEFBQcDBAYHKoUDAgIiBgYHKoUDAwcIAQYIKoUDAwcB
AQEGBiqFAwMHAQYKKwYBBAGCNxQCAgYHKoUDAwYAATARBgUqhQNkbwQIDAZmZ2JkZmcwJwYDVR0R
BCAwHqQcMBoxGDAWBggqhQMDgQ0BARMKNzgyNzAxMDAwMDAdBgNVHQ4EFgQUcptDmJmnjCYFiHYT
qUV3uzpe154wHwYDVR0jBBgwFoAUu5WQXMfu/Sh+KvktbnKGhg+UzbowgYQGA1UdHwR9MHsweaB3
oHWGc2ZpbGU6Ly9XSU4tVkgzMDBRUTFPRTEvY2VydGVucm9sbC9DZW50ZXItSW5mb3JtJTIwVGVz
dCUyMEdvc3QlMjBDQSUyMGZvciUyMEF1dG9tYXRlZCUyMENlcnRpZmljYXRpb24lMjBTZXJ2aWNl
cy5jcmwwgaMGCCsGAQUFBwEBBIGWMIGTMIGQBggrBgEFBQcwAoaBg2ZpbGU6Ly9XSU4tVkgzMDBR
UTFPRTEvY2VydGVucm9sbC9XSU4tVkgzMDBRUTFPRTFfQ2VudGVyLUluZm9ybSUyMFRlc3QlMjBH
b3N0JTIwQ0ElMjBmb3IlMjBBdXRvbWF0ZWQlMjBDZXJ0aWZpY2F0aW9uJTIwU2VydmljZXMuY3J0
MCAGBSqFA2RwBBcwFQwEZGZnYgwDZmdiDANmZ2IMA2RmZzAIBgYqhQMCAgMDQQDrI0ZZv4spqkAE
FgMctJ0u/alxpARIoas+EykdxXHNhsI+qo6dNUvlDcU6iumt2vneS1Roae5JpXxONR0xhCAaMYIB
6DCCAeQCAQEwZTBXMQswCQYDVQQGEwJSVTFIMEYGA1UEAxM/Q2VudGVyLUluZm9ybSBUZXN0IEdv
c3QgQ0EgZm9yIEF1dG9tYXRlZCBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzAgoVrmcdAAAAAAATMAoG
BiqFAwICCQUAoIIBHDAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0x
NjA1MjMxMDU5NTlaMC8GCSqGSIb3DQEJBDEiBCBe8YSJYXui2NLX4No4mqpP8CKtAaOVEqT+oajE
XkORSDCBsAYLKoZIhvcNAQkQAi8xgaAwgZ0wgZowgZcwCAYGKoUDAgIJBCAgZs3V6/iQi9GkX/56
BRMSGZJBQzzqS5IumTyjlmWxuTBpMFukWTBXMQswCQYDVQQGEwJSVTFIMEYGA1UEAxM/Q2VudGVy
LUluZm9ybSBUZXN0IEdvc3QgQ0EgZm9yIEF1dG9tYXRlZCBDZXJ0aWZpY2F0aW9uIFNlcnZpY2Vz
AgoVrmcdAAAAAAATMAoGBiqFAwICEwUABED8RT4JumVC2gUtGoMaemycUrRoysXZ7NOw++429MDg
Yj/k8VjwJdqvrNMiWnrEThkiQXLufj5fyADrtv6W5R9p

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *