сбой cURL с сертификатами SSL: ошибка 58 не удалось установить файл закрытого ключа
Я пытаюсь подключиться к удаленному хосту с помощью cURL. Подключение требует использования сертификата и закрытого ключа, который защищен паролем. До сих пор мне не удалось с этим кодом ниже:
<?php
$wsdl = 'https://domain.com/?wsdl';
$certFile = getcwd() . '/auth/cert.pem';
$keyFile = getcwd() . '/auth/key.pem';
$password = 'pwd';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $wsdl);
curl_setopt($ch, CURLOPT_SSLCERT, $certFile);
curl_setopt($ch, CURLOPT_SSLKEYPASSWD, $password);
curl_setopt($ch, CURLOPT_SSLKEY, $keyFile);
#curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
#curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
#curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$output = curl_exec($ch);
var_dump(curl_errno($ch));
var_dump(curl_error($ch));
в результате я постоянно получаю ошибка 58
: unable to set private key file: '/home/.../domains/.../public_html/auth/key.pem' type PEM
.
вещи, которые я пробовал до сих пор:
- Проверьте, читается ли ключевой файл, как предлагается здесь:невозможно использовать libcurl для доступа к сайту, требующему клиента проверка подлинности. Попытка передать файл через
openssl_private_key()
дает мне ресурс, а не логическое. Так что это кажется хорошим. - переключите порядок содержимого в ключе.файл pem, как предлагается здесь:невозможно использовать libcurl для доступа к сайту, требующему аутентификации клиента. Пока не повезло.
- играл с некоторыми другими вариантами, как
SLL_VERIFY_PEER
,SSL_VERIFY_HOST
,SSL_CERTTYPE
и другие параметры, которые казались тривиальными в отношении официальных PHP-документов. Не повезло так далеко.
Я уверен, что проблема заключается в моей конфигурации, но я не уверен, где искать.
2 ответов
я исправил эту проблему. Я думаю, что из-за количества вопросов, касающихся этого вопроса и количества различных решений, другие выиграют от решения. Вот:
я использовал openssl
программа CLI для преобразования .P12 key-file to a .PEM key-file. Фокус в том, как происходит преобразование.
сначала я конвертировал его с помощью этой команды и у меня была проблема, как описано в вопросе:
openssl pkcs12 -in key.p12 -out key.pem -nodes -clcerts
в то время как команда ниже сделал фактический трюк:
openssl pkcs12 -in key.p12 -out key.pem -clcerts
для получения дополнительной информации см. источник, который я использовал:https://community.qualys.com/docs/DOC-3273
на всякий случай, если это полезно для других, ищущих эту проблему, я обнаружил, что CURLOPT_SSLCERT и CURLOPT_SSLKEY, похоже, не работают с относительными путями.
Это с WAMP, php версии 5.5 на Windows.