#authentication #curl #client
#аутентификация #curl #клиент
Вопрос:
Я использую приведенный ниже фрагмент для настройки сертификата и ключа для аутентификации клиента.
curl_easy_setopt(curl,CURLOPT_SSLCERT,"clientCert.pem");
curl_easy_setopt(curl,CURLOPT_SSLCERTPASSWD,"changeit");
curl_easy_setopt(curl,CURLOPT_SSLCERTTYPE,"PEM");
curl_easy_setopt(curl,CURLOPT_SSLKEY,"privateKey.pem");
curl_easy_setopt(curl,CURLOPT_SSLKEYPASSWD,"changeit");
curl_easy_setopt(curl,CURLOPT_SSLKEYTYPE,"PEM");
В сертификате нет пароля, я не знаю, с какой стати существует опция SSLCERTPASSWD, я просто предоставил фиктивное значение.
Когда я запускаю программу в Linux, я получаю код ошибки 58 и сообщение об ошибке
невозможно установить файл закрытого ключа: ‘PrivateKey.pem’ типа PEM
Однако в Windows я не могу использовать сертификат клиента (ключ не найден или неверная фраза пароля?)
Кажется, предполагается, что сертификат и ключ не совпадают, но я не знаю как. Я извлек сертификат и ключ из файла p12 с помощью команд openssl. Команда, которую я использовал для извлечения ключа, является
openssl.exe pkcs12 -in client.p12 -nocerts -out privateKey.pem
и команда, используемая для извлечения сертификата, является
openssl.exe pkcs12 -in client.p12 -nokeys -out clientCert.pem
Файл p12 был успешно использован в браузере для доступа к URL-адресу аутентификации клиента.
Пожалуйста, помогите, пока я не застрелился.
Редактировать: Вот доказательство того, что закрытый ключ и сертификат соответствуют друг другу:
[debugbld@nagara ~/curlm]$ openssl x509 -noout -modulus -in clientCert.pem | openssl md5
d7207cf82b771251471672dd54c59927
[debugbld@nagara ~/curlm]$ openssl rsa -noout -modulus -in privateKey.pem | openssl md5
Enter pass phrase for privateKey.pem:
d7207cf82b771251471672dd54c59927
Так почему это не может работать?
Комментарии:
1. Я сталкиваюсь с тем же результатом с командной строкой curl. Я объединил сертификат клиента и ключ в файл и попробовал, как показано ниже: curl —cert concatenatedCert.pem —cert-type PEM —cacert cabundle.crt inaveo:8775/DataIntegrationService/WebService /WS_test Введите пароль PEM: curl: (58) не удалось установить файл закрытого ключа: ‘concatenatedCert.pem’ введите PEM
Ответ №1:
Используя curl командной строки, я получил ту же ошибку, используя файл .pem, который также был получен с помощью openssl из файла p12, p12 также смог работать должным образом, выполняя аутентификацию клиента при импорте в браузере. Я думаю, точно так же, как вы описали.
Моя проблема была вызвана тем, что в файле .pem не были перечислены сертификаты в правильном порядке: кажется, что за каждым сертификатом в файле должен следовать сертификат его эмитента. Я отредактировал файл и изменил порядок разделов, и curl был доволен.
Для справки, мой оригинальный файл .p12 был получен путем резервного копирования сертификата из Firefox.
Также обратите внимание, что в моем случае я не получал запрос на ввод пароля и получал
curl: (58) unable to set private key file: 'alice.pem' type PEM
перед запросом пароля
Ответ №2:
Я сталкивался с аналогичными проблемами, я выяснил, что проблема была связана с правами доступа к файлам сертификата и закрытого ключа. Процесс, выполняющий PHP, не имел доступа на чтение к этим файлам.
Единственное, что вы можете попробовать (и это помогло мне разобраться в этом), это запустить следующий код:
$result=openssl_get_privatekey('file://path/to/private/key.pem','password');
и проверьте, не является ли возвращаемое значение false и нет ли ошибок. Я получал:
file_get_contents(/path/to/private/key.pem): failed to open stream: Permission denied
Ответ №3:
Спасибо Хью за тему и раугферу за подсказку openssl. Последнее: и полезно, и вводит в заблуждение. 😉
На самом деле, я решил проблему, убедившись, что путь к файлу ключа указан правильно. И вот почему подсказка openssl вводила в заблуждение, хотя и помогала мне проверить, в порядке ли мой PEM-файл:
cURL требуется полный путь, но без префикса ‘file://’. В то время как fopen удовлетворен относительным путем, cURL — нет. Итак, все мои тесты по открытию ключевого файла прошли успешно, в то время как cURL — нет.
Кстати.:
curl_easy_setopt(curl,CURLOPT_SSLCERTPASSWD,"changeit");
curl_easy_setopt(curl,CURLOPT_SSLCERTTYPE,"PEM");
curl_easy_setopt(curl,CURLOPT_SSLKEYTYPE,"PEM");
не нужны, поскольку пароль используется только для расшифровки закрытого ключа, а по умолчанию используется PEM.