Цифровые подписи PHP

#php #html #openssl #certificate #digital-certificate

#php #HTML #openssl #сертификат #цифровой сертификат

Вопрос:

Я хочу подписать XML-файл цифровой подписью с помощью PHP, используя OpenSSL, пока что я могу сгенерировать XML со всей необходимой мне информацией, и у меня есть рабочая демонстрационная версия, которая подписывает и проверяет подпись (объявляя закрытый и открытый ключи в виде строки). У меня есть файл .cer и файл .key, которые я хочу использовать для подписи XML-файла. Как я могу этого добиться? Цель состоит в том, чтобы конечный пользователь просто загружал эти сертификаты и загружал подписанный XML. (Некоторая конкретная документация по этому поводу очень ценится)

РЕДАКТИРОВАТЬ: Хорошо, теперь я ознакомился с OpenSSL и его функциями, но все же мне нужно знать, как включить это в PHP:

 openssl pkcs8 -inform DER -in c:/route/myfile.key -passin pass:contraseña -out c:/route/myfile.pem
  

К этому:

 $data = "||2.0|ABCD|2|03-05-2010T14:11:36|49|2008|INGRESO|UNA SOLA EXHIBICIÓN|2000.00|00.00|2320.00|PAMC660606ER9|CONTRIBUYENTE PRUEBASEIS PATERNOSEIS MATERNOSEIS|PRUEBA SEIS|6|6|PUEBLA CENTRO|PUEBLA|PUEBLA|PUEBLA||MÉXICO|72000|CAUR390312S87|ROSA MARÍA CÁLDERON URIEGAS|TOPOCHICO|52|JARDINES DEL VALLE|NUEVO LEÓN|MEXICO|95465|1.00|SERVICIO|01|ASESORIA FISCAL Y ADMINISTRATIVA|2000.00|IVA|16.00|320.00|| "; 

$priv_key_id=openssl_get_privatekey("file://C:filesClavepr.key.pem");
$public_key_id=openssl_get_publickey("file://C:filescert.cer.pem");
$o=openssl_sign($data,$cadenafirmada, $priv_key_id,OPENSSL_ALGO_SHA1);
$sello=base64_encode($cadenafirmada);

var_dump($sello);
  

Комментарии:

1. @jcaron обновил мой пост

Ответ №1:

Некоторая конкретная документация по этому поводу очень ценится

Документация, которую вы ищете, является PKCS7_sign(3) .

Вы также можете увидеть, как OpenSSL использует это, изучив исходный код openssl smime утилиты. Вы можете найти исходный код по адресу <openssl src>/apps/smime.c . Вас интересуют блоки кода для operation == SMIME_SIGN и, вероятно, PKCS7_STREAM флаг.

Комментарии:

1. Я прочитал всю страницу и уже лучше ознакомился с OpenSSL, решение PKCS7 не сработало, мне удалось программно преобразовать мой сертификат в кодировке .cer в формат PEM, и я также преобразовал свой файл .key в формат PEM, используя pcks8 в консоли OpenSSL, используя 2 ключа в формате PEM, я также проверил их, но мне все еще нужно найти способ выполнить преобразование pkcs8 в PHP.

Ответ №2:

В настоящее время я использую сайты в hostgator, и я поднял запрос по этому вопросу, они настроили OpenSSL на сервере и снова включили его для меня, затем вместо использования exec () для выполнения я использовал shell_exec () затем выполнил эту команду непосредственно в консоли Linux, это выглядело следующим образом:

 shell_exec('openssl pkcs8 -inform DER -in '.$_SERVER['DOCUMENT_ROOT'].'/'.$path1.' -passin pass:'.$contrasena.' -out '.$_SERVER['DOCUMENT_ROOT'].'/'.$path1.'.pem');
  

Это была единственная проблема с самого начала.