Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> PHP и подпись в формате PKCS#7
Newto  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 9
Пользователь №: 4987
На форуме: 8 лет, 7 месяцев, 2 дня
Карма:




Приветствую, форумчане. Столкнулся я с такой вот задачкой: подписать строку в формате
PKCS#7 detached signature. Имеется сертификат в формате cer и он же перекодированный в формат pem. Собственно, как это сделать?

Гугленье на эту тему дает очень мало информации касательно данного вопроса в рамках php. В частности, нашел я php функцию openssl_pkcs7_sign, которая берет строку из файла, подписывает ее и засовывает в другой файл, однако работать она у меня наотрез отказывается, а именно пишет ошибку "error getting private key"(а openssl_error_string() выдает "error:0906D06C:PEM routines:PEM_read_bio:no start line"). Как эту ошибку победить я так и не понял, на всякий случай привожу свой код:


$ok = openssl_pkcs7_sign(realpath("text.txt"), "signed.txt",
'file://'.realpath('cert.pem'),
array ('file://'.realpath('cert.pem'), "secretPass"),
array ()
);



if(!$ok) print $mes = openssl_error_string();


Все файлы существуют и лежат в той же директории где и сам php скрипт. Права на чтение выставлены. Формат сертификата pem верен, строчки "-----BEGIN CERTIFICATE-----" и "-----END CERTIFICATE-----" присутствуют.

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


--------------------
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
depp  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 297
Пользователь №: 40589
На форуме: 2 года, 4 дня
Карма: 19




хостинг на винде?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Newto  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 9
Пользователь №: 4987
На форуме: 8 лет, 7 месяцев, 2 дня
Карма:




Цитата (depp @ 22.03.2016 - 08:26)
хостинг на винде?

Линукс.


--------------------
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
kaww  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1755
Пользователь №: 20757
На форуме: 6 лет, 10 месяцев, 5 дней
Карма: 184




Была похожая проблема, так же не получилось заставить работать openssl_*. В итоге решил примерно так:
public function sign($message, $getSignCert, $privKey, $privKeyPassword)
{
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "w"),
);

$command = 'openssl smime -sign -outform PEM -nocerts -signer '
. $getSignCert . ' -inkey ' . $privKey;
if ($privKeyPassword) {
$command .= ' -passin pass:"' . $privKeyPassword . '"';
}
$process = proc_open($command, $descriptorspec, $pipes);
if (is_resource($process)) {
fwrite($pipes[0], $message);
fclose($pipes[0]);
$content = stream_get_contents($pipes[1]);
fclose($pipes[1]);
$error = stream_get_contents($pipes[2]);
fclose($pipes[2]);
$resCode = proc_close($process);
if ($resCode == 0) {
return $content;
} else {
throw new RuntimeException($error, $resCode);
}
}

throw new RuntimeException('Can not execute command ' . $command);
}
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Newto  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 9
Пользователь №: 4987
На форуме: 8 лет, 7 месяцев, 2 дня
Карма:




Цитата (kaww @ 22.03.2016 - 08:31)
Была похожая проблема, так же не получилось заставить работать openssl_*. В итоге решил примерно так:
public function sign($message, $getSignCert, $privKey, $privKeyPassword)
{
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "w"),
);

$command = 'openssl smime -sign -outform PEM -nocerts -signer '
. $getSignCert . ' -inkey ' . $privKey;
if ($privKeyPassword) {
$command .= ' -passin pass:"' . $privKeyPassword . '"';
}
$process = proc_open($command, $descriptorspec, $pipes);
if (is_resource($process)) {
fwrite($pipes[0], $message);
fclose($pipes[0]);
$content = stream_get_contents($pipes[1]);
fclose($pipes[1]);
$error = stream_get_contents($pipes[2]);
fclose($pipes[2]);
$resCode = proc_close($process);
if ($resCode == 0) {
return $content;
} else {
throw new RuntimeException($error, $resCode);
}
}

throw new RuntimeException('Can not execute command ' . $command);
}

Большое спасибо. Дайте еще парочку разъяснений, пожалуйста, если не трудно.

$getSignCert - тут, как я понимаю, должен быть путь к сертификату?
$privKey - приватный ключ? В каком виде он должен быть?
$privKeyPassword - пароль к ключу? А он в каком виде должен быть?


--------------------
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
kaww  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1755
Пользователь №: 20757
На форуме: 6 лет, 10 месяцев, 5 дней
Карма: 184




Newto, Что и как передавать можно посмотреть выполнив в терминале man smime , или, например, тут https://www.openssl.org/docs/manmaster/apps/smime.html . Привел лишь пример, набор аргументов может отличаться для вашего конкретного случая.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса