php get_headers не работает для URL-адреса, который я могу ввести в браузер

Я использую get_headers для проверки действительности URL-адреса.

https://central.bac-lac.gc.ca/.item/?app=Census1921&op=img&id=e002943819

Если я введу этот URL-адрес в свой браузер, он заработает. Но если я хочу протестировать URL-адрес ПЕРЕД тем, как вставить его в тег, передав его в get_headers, это не удастся.

Предупреждение: get_headers (): операция SSL завершилась неудачно с кодом 1. Сообщения об ошибках OpenSSL: ошибка: 1416F086: процедуры SSL: tls_process_server_certificate: проверка сертификата не удалась в /home/jamescobban/public_html/DisplayImage.php в строке 186

Предупреждение: get_headers (): не удалось включить шифрование в /home/jamescobban/public_html/DisplayImage.php в строке 186

Предупреждение: get_headers (https://central.bac-lac.gc.ca/.item/?app=Census1921&op=img&id=e002943819): не удалось открыть поток: не удалось выполнить операцию в /home/jamescobban/public_html/DisplayImage.php в строке 186

Поэтому мой код выдает сообщение об ошибке вместо того, чтобы вставлять URL-адрес в тег.

См. Это на https://www.jamescobban.net/DisplayImage.php?src=https%3A%2F%2Fcentral.bac-lac.gc.ca%2F.item%2F%3Fapp%3DCensus1921%.26op%3Dimg%26id%3De002943819&buttonname=imageButton&lang=en

Сравните это с https://www.jamescobban.net/DisplayImage.php?src=https%3A%2F%2Fdata2.collectionscanada.ca%2F1911%2Fjpg%2Fe001984006.jpg&buttonname=imageButton&lang=en, который is администрируется тем же отделом, но на другом сервере. Поскольку ответ представляет собой не что иное, как JPEG, я спросил их, почему они добавили сложность запуска сценария, но они являются ПРАВИТЕЛЬСТВОМ и не должны отвечать простым налогоплательщикам. К счастью, на данный момент они не удалили старые серверы, на которых просто хранились изображения, но этот режим доступа недоступен для последней опубликованной переписи. Как видите, единственная цель моего сценария - добавить оболочку вокруг JPEG, чтобы пользователь мог выполнять некоторые операции с изображением.

Я подозреваю, что проблема в том, что на этом веб-сайте ПРАВИТЕЛЬСТВА используется сертификат с истекшим сроком действия. Я сообщил, что обнаружил эту проблему в отделе несколько месяцев назад, но они под предлогом COVID сидят на задних лапах, хотя, очевидно, их веб-сайт важнее, чем когда-либо в наши дни, когда мы не можем войти в их офис!

Как я могу убедить get_headers игнорировать плохой сертификат так же, как это делают браузеры? В конце концов, это не значит, что я не доверяю тому, что домен, заканчивающийся на .gc.ca, законно предоставлен правительством, но по соображениям конфиденциальности все же желательно зашифровать мои обмены данными с любым государственным учреждением.

Предложение отключить проверку безопасности недопустимо. Я просто хочу, чтобы get_headers сообщал мне, можно ли использовать URL-адрес в теге, чтобы я не получал сообщение об ошибке по умолчанию от браузера.

Если вы хотите увидеть код, вызывающий get_header, перейдите на https://github.com/jcobban/Genealogy/blob/master/DisplayImage.php


person James Cobban    schedule 17.01.2021    source источник
comment
На сервере неверная настройка, см. этот SSLLabs отчет и поиск цепи неполный. Вот почему это не удается. И не ждите, что другие будут копаться в каком-то большом коде, чтобы узнать, что вы делаете, - вместо этого создайте минимальный пример.   -  person Steffen Ullrich    schedule 18.01.2021
comment
Благодарю за ваш ответ. Однако я не могу контролировать, что делают или не делают администраторы другого сайта. Это правительственный сервер, на который я просто пытаюсь определить ссылки с моего сайта. Как я уже сказал, я уже знал, что сертификат нарушен. Но ни один браузер, даже Firefox, не жалуется на этот сертификат низкого качества, даже в предупреждении. Мне нужен способ убедиться, что href будет работать, прежде чем вставлять его в тег. Мне нужно иметь возможность работать с неисправными серверами, которые Я НЕ МОГУ ИСПРАВИТЬ.   -  person James Cobban    schedule 18.01.2021


Ответы (1)


Я заставил это работать, предоставив контекст:

        $context    = stream_context_create(['ssl' => [
                                                'verify_peer' => false,
                                                'verify_peer_name' => false,
                                            ]]);
        $headers                = get_headers($src,0,$context);
person James Cobban    schedule 17.01.2021