[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: PHP и подпись в формате PKCS#7
Newto
Приветствую, форумчане. Столкнулся я с такой вот задачкой: подписать строку в формате
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-----" присутствуют.

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

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

Линукс.

_____________
kaww
Была похожая проблема, так же не получилось заставить работать 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);
}
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.