Я пытаюсь отладить проблему с проверкой сертификата ssl и определил, что openssl получает адреса сертификатов с возвратом неправильных путей. (Смотри ниже)
Как определить, как это установить? Я просмотрел файл php.ini и не нашел эту ссылку нигде.
cmuench-air:bin cmuench$ ./php -r "print_r(openssl_get_cert_locations());" Array ( [default_cert_file] => /bitnami/mampstack56Dev-osx-x64/output/common/openssl/cert.pem [default_cert_file_env] => SSL_CERT_FILE [default_cert_dir] => /bitnami/mampstack56Dev-osx-x64/output/common/openssl/certs [default_cert_dir_env] => SSL_CERT_DIR [default_private_dir] => /bitnami/mampstack56Dev-osx-x64/output/common/openssl/private [default_default_cert_area] => /bitnami/mampstack56Dev-osx-x64/output/common/openssl [ini_cafile] => [ini_capath] => )
php.ini (соответствующие части) … Я не вижу bitnami / mampstack56Dev где угодно …
[openssl] ; The location of a Certificate Authority (CA) file on the local filesystem ; to use when verifying the identity of SSL/TLS peers. Most users should ; not specify a value for this directive as PHP will attempt to use the ; OS-managed cert stores in its absence. If specified, this value may still ; be overridden on a per-stream basis via the "cafile" SSL stream context ; option. ;openssl.cafile= ; If openssl.cafile is not specified or if the CA file is not found, the ; directory pointed to by openssl.capath is searched for a suitable ; certificate. This value must be a correctly hashed certificate directory. ; Most users should not specify a value for this directive as PHP will ; attempt to use the OS-managed cert stores in its absence. If specified, ; this value may still be overridden on a per-stream basis via the "capath" ; SSL stream context option. ;openssl.capath= ;Curl ca bundle certificate curl.cainfo="/Applications/phppos/common/openssl/certs/curl-ca-bundle.crt"
РЕДАКТИРОВАТЬ:
Я знаю, что это глупо, но есть моменты, когда сертификат ssl будет подписан сам собой. Есть ли параметр ini, который я могу изменить, чтобы отключить проверку всех сертификатов? или я должен сделать это в коде для сокетов и завитки?
Если вы проверяете источник PHP для функции openssl_get_cert_locations()
, он получает эти местоположения, вызывая различные функции OpenSSL, такие как X509_get_default_cert_file
и просматривает значения php.ini
openssl.cafile
и openssl.capath
описанные здесь .
Какие сертификаты / пути вы ищете точно? Если вы пытаетесь получить файл пакета CA, вы можете установить указанные выше значения php.ini
чтобы они были возвращены openssl_get_cert_locations
.
Файл php.ini
умолчанию для PHP 5.6 не имеет настроек по умолчанию для этих настроек OpenSSL ini, поскольку их необходимо определить вручную. Эта конфигурация расположена ближе к концу php.ini
[openssl] ; The location of a Certificate Authority (CA) file on the local filesystem ; to use when verifying the identity of SSL/TLS peers. Most users should ; not specify a value for this directive as PHP will attempt to use the ; OS-managed cert stores in its absence. If specified, this value may still ; be overridden on a per-stream basis via the "cafile" SSL stream context ; option. ;openssl.cafile= ; If openssl.cafile is not specified or if the CA file is not found, the ; directory pointed to by openssl.capath is searched for a suitable ; certificate. This value must be a correctly hashed certificate directory. ; Most users should not specify a value for this directive as PHP will ; attempt to use the OS-managed cert stores in its absence. If specified, ; this value may still be overridden on a per-stream basis via the "capath" ; SSL stream context option. ;openssl.capath=
При использовании cURL, если вы хотите отключить проверку сертификатов, вы можете передать эти параметры curl_setopt()
:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // shouldn't need this
CURLOPT_SSL_VERIFYPEER
описывается как:
FALSE, чтобы остановить cURL от проверки сертификата партнера. Альтернативные сертификаты для проверки могут быть указаны с помощью опции CURLOPT_CAINFO, или каталог сертификата может быть указан с помощью опции CURLOPT_CAPATH.
CURLOPT_SSL_VERIFYHOST
описывается как:
1, чтобы проверить наличие общего имени в SSL-сертификате. 2, чтобы проверить наличие общего имени, а также убедиться, что он соответствует указанному имени хоста. В производственных средах значение этой опции должно быть равно 2 (значение по умолчанию).
Если у вас есть файлы CA, вы можете использовать опцию CURLOPT_CAINFO
чтобы предоставить полный путь к файлу, содержащему один или несколько сертификатов для проверки партнера.
Чтобы отключить проверку потока, открытого с помощью fsockopen
, попробуйте:
<?php $context = stream_context_create(); $result = stream_context_set_option($context, 'ssl', 'verify_peer', false); $socket = stream_socket_client('ssl://'.$host . ':443', $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
См. Параметры контекста SSL для получения дополнительной информации и stream_socket_client()
.