В настоящее время я тестирую API на веб-сайте с сертификатом, выполняя php-скрипт, который использует curl, в командной строке на моем локальном компьютере с Windows. Но скрипту так и не удается добраться до сервера. Я искал решения для этой, по-видимому, частой ошибки и безуспешно пробовал следующее:
- Убедился, что сертификат еще действителен.
- Убедитесь, что расширение openssl php включено в 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
В настоящее время у меня нет идей, чтобы проверить, что я сделал неправильно и как это исправить.