Как решить ошибку «не удалось загрузить сертификат клиента PEM, ошибка OpenSSL: 02001003: системная библиотека: fopen: такого процесса нет»? - PullRequest
0 голосов
/ 13 октября 2018

Извините, если вопрос глупый, но я новичок в этой области.Мне нужно подключиться к сервису через SSL с сайта Drupal 7.У меня есть файл с расширением .p12 и пароль для него.Также я использую PHP 7.1 1 и Windows 7 64x.Я преобразовал .p12-файл в .pem-файл, используя следующую команду:

openssl pkcs12 -in myfile.p12 -out myfile.pem 

Прежде чем я установил Openssl на свой компьютер и добавил пути в Windows.После этого я пытаюсь использовать следующий код для подключения к серверу с использованием функций CURL.

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'my_addr');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSLCERT, 'myfile.pem');
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, 'mypsw');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$result = curl_exec($ch);

if ($result === FALSE){
  $curl_error = curl_error($ch);
}
curl_close($ch);

К сожалению, curl_exec возвращает FALSE, а curl_error возвращает следующее:

could not load PEM client certificate, OpenSSL error error:02001003:system library:fopen:No such process, (no key found, wrong pass phrase, or wrong file format?)

Iрешите выполнить этот код на сайте клиента, который находится на общем хостинге Linux, тогда как мой localhost работает на Windows 7 64x.Код выполняется без ошибок, но curl_exec возвращает пустую строку.

Хочу уточнить, что я делаю не так и почему сертификат клиента PEM не хочет загружаться?Что я должен сделать на своем локальном хосте, чтобы решить эту проблему?Я не могу отказаться от использования Windows 7 и начать использовать Linux вместо него.

Ответы [ 2 ]

0 голосов
/ 02 июня 2019

Бьюсь об заклад, ошибку будет легче понять, если вы измените ее на

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'my_addr');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
$pem=realpath("myfile.pem");
if(!$pem || !is_readable($pem)){
    die("error: myfile.pem is not readable! realpath: \"{$pem}\" - working dir: \"".getcwd()."\" effective user: ".print_r(posix_getpwuid(posix_geteuid()),true));
}
curl_setopt($ch, CURLOPT_SSLCERT, $pem);

.. Скорее всего, файл pem не читается учетной записью, под которой работает php (например, если вы создалифайл в качестве пользователя root, а владелец - root: root и права доступа a-r, а php запущен под учетной записью www-data), другое объяснение состоит в том, что файл не существует - еще одно объяснение заключается в том, что вы запускаете chdir() до запуска curl_exec () и поскольку вы используете относительный путь к файлу, относительный путь больше не действителен при запуске curl_exec () (но использование realpath (), как я делал выше, решает эту последнюю проблему)

0 голосов
/ 22 апреля 2019

Для проверки SSL вам необходим сертификат в формате pem, связанный с ним закрытый ключ (в формате openssl) и корневой сертификат центра сертификации, подписавшего ваш сертификат в формате pem.

Проверьте этот полный пример:

PHP: путь CURLOPT_SSLCERT

Сообщение об ошибке не совсем ясно, если вы не проинформированы, но оно говорит:

не удалось загрузить сертификат клиента PEM, ошибка OpenSSL: 02001003: системная библиотека: fopen: такого процесса нет, ( ключ не найден , неверная пароль или неправильный формат файла?)

С уважением,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...