MAMP & PHP «Сбой операции SSL с кодом 1» - PullRequest
0 голосов
/ 03 января 2019

РЕДАКТИРОВАТЬ В данный момент я нахожусь в движении, и у меня есть только 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 не доверяет самоподписанному (но я думал, что он использовал доверенные CA изоперационной системы?) и я не могу заставить его работать, используя следующий потоковый контекст:

stream_context_create([
   "ssl" => [
      "allow_self_signed" => true
   ]
]);

И если я установлю verify_peer и verify_peer_name в false, запрос будет выполнен, но файлы cookie HTTPS не будутне отправлено, что нарушает все это.

Я попытался добавить фактический текст сертификата в файл cacert.pem в каталоге OpenSSL в MAMP и установить этот файл в параметре openssl.cafileв файле php.ini, как указано в другом ответе, но, увы, не повезло ...

Есть идеи?Ваша помощь будет высоко ценится!Спасибо!10

РЕДАКТИРОВАТЬ 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

... и это файл, в который я добавил необработанный сертификат вверху ... тьфу, STUCK!

1 Ответ

0 голосов
/ 05 января 2019

TLDR;Вы должны стать вашим собственным (мини) ЦС, чтобы у вас был Root Cert, которому можно доверять

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

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

Теперь вы можете перейти к тому файлу, который использует OpenSSL, который имеет все большие корневые сертификаты, и я подумалэто будет так же просто, как разместить необработанный самозаверяющий сертификат сайта разработки в верхней части списка, и все станет на свои места. Однако , по какой-то причине OpenSSL не будет доверять ему, если это не СЕРТИФИКАТ КОРНЯ .

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

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

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

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

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

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

...