Невозможно использовать libcurl для доступа к сайту, требующему аутентификации клиента

#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.