Проблема с сертификатом SSL: невозможно получить сертификат эмитента - PullRequest
1 голос
/ 14 марта 2019

В настоящее время я тестирую API на веб-сайте с сертификатом, выполняя php-скрипт, использующий curl, в командной строке на моем локальном компьютере с Windows. Но сценарию никогда не удается добраться до сервера. Я искал решения для этой, по-видимому, частой ошибки и безуспешно пробовал следующее:

  • Удостоверился, что сертификат все еще действителен.
  • Удостоверился, что расширение php openssl включено в php.ini, и что .dll действительно есть.
  • Загрузил последний пакет сертификатов с https://curl.haxx.se/docs/caextract.html,, как объясняется в ответе на этот вопрос , и добавил его в php.ini. Я также проверил, что центр сертификации для веб-сайта, с которым я пытаюсь связаться, действительно находится в этом комплекте (в моем случае, Comodo).
  • Загружен старый пакет сертификатов, который ближе к началу срока действия сертификата веб-сайта.
  • Загрузил сертификат непосредственно из центра сертификации по по этой ссылке и добавил .crt в мой файл php.ini.
  • Преобразовал полученный выше файл .crt в .pem, используя этот инструмент , затем добавив его в php.ini (заменив тот, что выше).

Вот скрипт, который я использую для тестирования (я выполняю его, используя php только в командной строке):

$data = 'username=myuser&password=mypassword';
$ch = curl_init('https://my.website.com/auth');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_VERBOSE, true);
//curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_exec($ch);
curl_close($ch);

Если я раскомментирую две строки, чтобы полностью обойти проверку сертификата, она будет работать отлично, но я хочу этого избежать.

Во всех случаях я пробовал путь как с косой чертой, так и с обратной косой чертой, я уверен, что используется правильный php.ini и что у php есть доступ к расположению файла .pem. Это подтверждается выводом скрипта php (я заменил фактический URL, который я использую):

> *   Trying 192.168.200.11...
> * TCP_NODELAY set
> * Connected to my.website.com (192.168.200.11) port 443 (#0)
> * ALPN, offering http/1.1
> * successfully set certificate verify locations:   
> CAfile: C:\Development\examples\COMODORSADomainValidationSecureServerCA.pem  
> CApath: none
> * NPN, negotiated HTTP1.1
> * SSL certificate problem: unable to get issuer certificate
> * stopped the pause stream!
> * Closing connection 0

В настоящее время у меня нет идей проверить, что я сделал не так и как это исправить.

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

Итак, вот, в конце концов, вот, как мне наконец удалось это сделать: как следует из ошибки, и пара ответов также указывают на то, что цепочка сертификатов центра сертификации отсутствует в моей конфигурации и отсутствует в пакете.скачано с https://curl.haxx.se/docs/caextract.html.

Итак, в конце концов, я нашел этот вопрос , который указал мне правильное направление: я зашел на сайт, к которому пытался подключиться с помощью firefox, и экспортировал сертификат как тип "X.509 «Сертификат с цепочкой (PEM)», в файл C: /Development/examples/mycert.pem.Затем я изменил свою конфигурацию php.ini на

curl.cainfo = C: /Development/examples/my.website.com.pem openssl.cafile = C: / Development / examples / my.website.com.pem

И это сработало!Я могу подключиться к веб-сайту без проблем.

Также возможно просто скопировать и вставить содержимое my.website.com.pem в конце файла, загруженного с https://curl.haxx.se/docs/caextract.html,, итакже работает и, вероятно, более универсален, если вам нужно подключаться к другим веб-сайтам, использующим сертификаты с php curl.

0 голосов
/ 14 марта 2019

Вы можете подключиться к серверу из командной строки с помощью curl?

curl -vs https://my.website.com/auth --cacert C:\Development\examples\COMODORSADomainValidationSecureServerCA.pem 

Возможно, существует несоответствие между сертификатом сервера и загруженным комплектом, т. Е. Сертификат не входит в комплект.

Если у вас установлен openssl, вы можете извлечь сертификат CA с вашего сервера с помощью

openssl s_client -showcerts -servername server -connect server:443 > cacert.pem

Описание аналогичной проблемы можно найти здесь

...