В настоящее время я тестирую 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
В настоящее время у меня нет идей проверить, что я сделал не так и как это исправить.