РЕДАКТИРОВАТЬ
В данный момент я в движении, и у меня есть только SO в приложении Stack Exchange на моем iPhone, поэтому есть странное форматирование с цитатами в коде ниже — Извинения! У меня есть настоящие в реальном коде 🙂
Я пытался выяснить это в течение двух дней с некоторыми другими вопросами по SO, но здесь идет …
Просто пытаюсь использовать file_get_contents()
захватить веб-страницу другого файла, расположенного на том же сервере и в том же домене, и включить его. Я использую MAMP с самозаверяющим сертификатом для производства (чтобы у меня был сервер с SSL и т. Д.), Так что есть, и у меня также есть этот сертификат как «Всегда доверенный» локально на моем Mac, поскольку он самозаверяющий, очевидно.
Так что теперь у меня есть проблема, когда я хочу, чтобы одна страница захватывала содержимое другой .. Сначала я попытался использовать cURL, и она не давала никаких исключений и не использовала информацию curl_error()
поэтому я переключился на file_get_contents()
где я получаю исключение SSL operation failed with code 1
… ssl3_get_server_certificate:certificate verify failed
Я предполагаю, что это связано с тем, что OpenSSL не доверяет самоподписанному (но я думал, что он использовал доверенные ЦС базовой ОС?) И не могу заставить его работать, используя следующий потоковый контекст:
stream_context_create([
"ssl" => [
"allow_self_signed" => true
]
]);
И если я установлю verify_peer
а также verify_peer_name
ложно, запрос сделан, но куки HTTPS не отправляются, что нарушает все.
Я попытался добавить фактический текст сертификата в cacert.pem
файл в каталоге OpenSSL в MAMP, и установите этот файл в openssl.cafile
вариант в php.ini
файл, как указано в другом ответе, но, увы, не повезло …
Есть идеи? Ваша помощь будет высоко ценится! Спасибо! ☺️
РЕДАКТИРОВАТЬ 2
Поэтому я попробовал это снова, используя cURL, и на этот раз получил cURL, чтобы дать мне подробный вывод в файл, и это то, что он мне дает (обратите внимание на строку третья снизу):
* Trying ::1...
* TCP_NODELAY set
* Connected to admin.voyagerisc (::1) port 8890 (#0)
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
* CAfile: /Applications/MAMP/Library/OpenSSL/certs/cacert.pem CApath: none
* SSL certificate problem: unable to get local issuer certificate
* Curl_http_done: called premature == 1
* Closing connection 0
…и это файл, в который я добавил необработанный сертификат в верхнюю часть.
Поэтому после нескольких кропотливых дней я наконец-то понял это и надеюсь, что ниже поможет тем немногим пользователям MAMP / PHP, которые, несомненно, столкнутся с этой проблемой !!
В принципе, file_get_contents()
а также cURL
работать над OpenSSL и (как я теперь узнал, я был нубом по SSL!) OpenSSL, как и каждое устройство, в основном имеет большой список всех корневых сертификатов основного центра сертификации. Поэтому, если какой-либо сертификат был подписан одним из этих корневых сертификатов, ему можно доверять в глазах OpenSSL.
Теперь вы можете перейти к тому файлу, который использует OpenSSL, который имеет все большие корневые сертификаты, и я подумал, что это будет так же просто, как разместить необработанный самозаверяющий сертификат сайта разработки в верхней части списка, и все станет на свои места. , тем не мение, по какой-то причине OpenSSL не будет доверять, если это не Корневой сертификат.
Короче говоря, вот шаги:
/Applications/MAMP/Library/OpenSSL
— Открой cacert.pem
в вашей IDE, а также-----BEGIN CERTIFICATE-----
строка) имя, которое вы установили для своего центра сертификации ранее на шаге 1, и отформатируйте его с помощью =
Это как с другими центрами сертификации.Теперь, если вы используете локальный сервер разработки с MAMP и включили самозаверяющий SSL, вы должны теперь иметь возможность делать вызовы SSL обратно самому серверу и иметь доверие к серверу …. самому себе? Похоже? Странно, когда вы думаете об этом!
В заключение, если бы вы посетили другие подобные вопросы здесь, в SO, вы бы увидели, что многие ответы побуждают вас создавать либо потоковый контекст с get_file_contents()
или установите некоторые параметры с помощью cURL
ресурс, который предложил превратить "verify_peer" => false
& "verify_peer_name" => false
в контексте потока, или эквивалентные опции для cURL
, я не могу подчеркнуть достаточно что этот подход полностью противоречит цели SSL и его даже не следует использовать для локальной разработки, поскольку вы можете забыть включить его или каким-либо другим неясным событием, которое вызывает отключение доверия в рабочей среде.
Метод, который я описал выше, более утомителен, да, но он поможет вам в процессе разработки, пока у вас не будет действительного сертификата SSL в рабочей среде, подписанного настоящим ЦС, и с этого момента это уже не будет проблемой.
Не стесняйтесь комментировать, если это объяснение не является достаточно ясным / точным, я все еще думаю об этом! Ура 🙂
Других решений пока нет …