openssl — MAMP & amp; PHP «Сбой операции SSL с кодом 1»

РЕДАКТИРОВАТЬ
В данный момент я в движении, и у меня есть только SO в приложении Stack Exchange на моем iPhone, поэтому есть странное форматирование с цитатами в коде ниже — Извинения! У меня есть настоящие в реальном коде 🙂

Я пытался выяснить это в течение двух дней с некоторыми другими вопросами по SO, но здесь идет …

Просто пытаюсь использовать file_get_contents() захватить веб-страницу другого файла, расположенного на том же сервере и в том же домене, и включить его. Я использую MAMP с самозаверяющим сертификатом для производства (чтобы у меня был сервер с SSL и т. Д.), Так что есть, и у меня также есть этот сертификат как «Всегда доверенный» локально на моем Mac, поскольку он самозаверяющий, очевидно.

Так что теперь у меня есть проблема, когда я хочу, чтобы одна страница захватывала содержимое другой .. Сначала я попытался использовать cURL, и она не давала никаких исключений и не использовала информацию curl_error() поэтому я переключился на file_get_contents() где я получаю исключение SSL operation failed with code 1ssl3_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

…и это файл, в который я добавил необработанный сертификат в верхнюю часть.

1

Решение

Поэтому после нескольких кропотливых дней я наконец-то понял это и надеюсь, что ниже поможет тем немногим пользователям MAMP / PHP, которые, несомненно, столкнутся с этой проблемой !!

В принципе, file_get_contents() а также cURL работать над OpenSSL и (как я теперь узнал, я был нубом по SSL!) OpenSSL, как и каждое устройство, в основном имеет большой список всех корневых сертификатов основного центра сертификации. Поэтому, если какой-либо сертификат был подписан одним из этих корневых сертификатов, ему можно доверять в глазах OpenSSL.

Теперь вы можете перейти к тому файлу, который использует OpenSSL, который имеет все большие корневые сертификаты, и я подумал, что это будет так же просто, как разместить необработанный самозаверяющий сертификат сайта разработки в верхней части списка, и все станет на свои места. , тем не мение, по какой-то причине OpenSSL не будет доверять, если это не Корневой сертификат.

Короче говоря, вот шаги:

  1. следить это руководство стать вашим собственным CA буквально за 5 минут. (Как примечание, это теперь означает, что вы можете доверять просто только что созданный корневой сертификат, и для каждого сайта разработки, который вы хотите использовать с SSL, самостоятельно подписывайте этот корневой сертификат, и вам не нужно будет повторно доверять и т. д.)
  2. Как только вы доверяете корневому сертификату согласно статье, и остроконечный MAMP к ключу и сертификату для конкретный сайт, в вашей IDE откройте файл .pem для Корневой сертификат что вы создали, а не конкретный для вашего сайта разработки
  3. Для MAMP файл, который OpenSSL использует в качестве основного списка доверенных центров сертификации, находится в /Applications/MAMP/Library/OpenSSL — Открой cacert.pem в вашей IDE, а также
  4. Теперь, под комментариями и перед первым настоящим CA, скопируйте и вставьте необработанные данные вашего корневого сертификата. Вы также можете добавить до этого длинный кусок данных (и ДО -----BEGIN CERTIFICATE----- строка) имя, которое вы установили для своего центра сертификации ранее на шаге 1, и отформатируйте его с помощью =Это как с другими центрами сертификации.
  5. Обычный: сохранить & перезапустите MAMP

Теперь, если вы используете локальный сервер разработки с MAMP и включили самозаверяющий SSL, вы должны теперь иметь возможность делать вызовы SSL обратно самому серверу и иметь доверие к серверу …. самому себе? Похоже? Странно, когда вы думаете об этом!

В заключение, если бы вы посетили другие подобные вопросы здесь, в SO, вы бы увидели, что многие ответы побуждают вас создавать либо потоковый контекст с get_file_contents() или установите некоторые параметры с помощью cURL ресурс, который предложил превратить "verify_peer" => false & "verify_peer_name" => false в контексте потока, или эквивалентные опции для cURL, я не могу подчеркнуть достаточно что этот подход полностью противоречит цели SSL и его даже не следует использовать для локальной разработки, поскольку вы можете забыть включить его или каким-либо другим неясным событием, которое вызывает отключение доверия в рабочей среде.

Метод, который я описал выше, более утомителен, да, но он поможет вам в процессе разработки, пока у вас не будет действительного сертификата SSL в рабочей среде, подписанного настоящим ЦС, и с этого момента это уже не будет проблемой.

Не стесняйтесь комментировать, если это объяснение не является достаточно ясным / точным, я все еще думаю об этом! Ура 🙂

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]