PhantomJS не может открыть сайт HTTPS


104

Я использую следующий код, основанный на примере loadpeed.js, чтобы открыть сайт https: //, который также требует аутентификации http-сервера.

var page = require('webpage').create(), system = require('system'), t, address;

page.settings.userName = 'myusername';
page.settings.password = 'mypassword';

if (system.args.length === 1) {
    console.log('Usage: scrape.js <some URL>');
    phantom.exit();
} else {
    t = Date.now();
    address = system.args[1];
    page.open(address, function (status) {
        if (status !== 'success') {
            console.log('FAIL to load the address');
        } else {
            t = Date.now() - t;
            console.log('Page title is ' + page.evaluate(function () {
                return document.title;
            }));
            console.log('Loading time ' + t + ' msec');
        }
        phantom.exit();
    });
}  

Его неспособность загружать страницу все время. Что здесь могло быть не так? Можно ли по-другому обращаться с защищенными сайтами? Однако доступ к сайту из браузера возможен.

Я только начинаю с Phantom прямо сейчас и считаю его слишком хорошим, чтобы перестать возиться, даже если я не продвигаюсь вперед с этой проблемой.

Ответы:


153

Я попробовал ответы Фреда и Кэмерона Тинкера, но, похоже, мне помогает только --ssl-protocol = любой вариант:

phantomjs --ssl-protocol=any test.js

Также я думаю, что это должно быть безопаснее, --ssl-protocol=anyпоскольку вы все еще используете шифрование, но --ignore-ssl-errors=trueигнорируете (да) все ошибки ssl, включая вредоносные.


1
Мне пришлось использовать эти 3 аргумента, и он решил: «--web-security = false», «--ssl-protocol = any», «--ignore-ssl-errors = true». webdriver.PhantomJS (service_args = ['- ignore-ssl-errors = true', «--web-security = false», «--ssl-protocol = any»])
Абдул Халид

123

Проблема, скорее всего, связана с ошибками сертификата SSL. Если вы запустите phantomjs с параметром --ignore-ssl-errors = yes , он должен продолжить загрузку страницы, как если бы не было ошибок SSL:

phantomjs --ignore-ssl-errors=yes [phantomOptions] script.js [scriptOptions]

Я видел несколько веб-сайтов, у которых возникли проблемы с неправильной реализацией своих SSL-сертификатов или с истекшим сроком их действия и т. Д. Полный список параметров командной строки для phantomjs доступен здесь: http://phantomjs.org/api/command-line. html . Надеюсь, это поможет.


2
Спасибо, это тоже решило мою проблему. В моем случае я не получал ошибку Cert в браузере, поэтому это было очень запутанно, но я сделал подробный curl и заметил, что тот, который не работал, использовал Wildcard Cert (т.е. CN = *. Example.com). Было бы неплохо, если бы phantomjs могли возвращать подробную причину, почему это не удалось.
naoko

7
Святые обезьяны. Хотелось бы, чтобы ошибка SSL была объяснена, только переполнение стека и розовый единорог помогли мне отследить основную причину. Спасибо, ребята
SimplGy

Рад, что это помогает людям. Возможно, PhantomJS потребуется обновление, чтобы предоставлять подробные ошибки SSL с другим аргументом командной строки. Я знаю, что информация об ошибках SSL доступна в Qt, но в большинстве случаев люди просто подавляют ошибки, не обрабатывая их явным образом.
Кэмерон Тинкер

Я знаю, что опаздываю в игру, но я обнаружил, что добавление опции после имени скрипта не работает - вы должны вызывать его по порядку:phantomjs --ignore-ssl-errors=yes script.js
simonlchilds

Да, --ignore-ssl-errors=yesопция должна стоять перед именем скрипта. Спасибо, что указали на это.
Кэмерон Тинкер

71

Обратите внимание, что с 2014-10-16 PhantomJS по умолчанию использует SSLv3 для открытия HTTPS-соединений. Из- за недавно объявленной уязвимости POODLE многие серверы отключают поддержку SSLv3.

Чтобы обойти это, вы должны иметь возможность запускать PhantomJS с помощью:

phantomjs --ssl-protocol=tlsv1

Надеюсь, PhantomJS скоро будет обновлен, чтобы сделать TLSv1 по умолчанию вместо SSLv3.


4
Версия 1.9.8 переключает значение по умолчанию на TLSv1: github.com/ariya/phantomjs/issues/12670
Энди Триггс,

Исправлено для меня, SSLv3 был отключен на сервере
Крис Херринг

2
Обратите внимание, что обновление до PhantomJS 1.9.8 приводит к новой ошибке .
Artjom B.

Это должен быть принятый ответ. На мой взгляд, отключение SSL или разрешение любого протокола - не лучшее решение. Спасибо, что поделился.
Dominic P

3
Как я могу получить более подробную отладку из-за проблем с подтверждением SSL?
wrschneider

24


возникла такая же проблема ... --ignore-ssl-errors = да было недостаточно, чтобы исправить это для меня, пришлось сделать еще две вещи:
1) изменить пользовательский агент
2) перепробовал все ssl-протоколы, единственный, который работал был tlsv1 для рассматриваемой страницы
Надеюсь, это поможет ...


2
Смена ssl-протоколов на tlsv1 у меня тоже сработала, спасибо!
Дэйв Стибрэни

1
+1 Исправлена ​​моя проблема, повезло, что тебя здесь нет, так как я бы тебя поцеловал прямо сейчас, лол, ура
Мартин

Это именно то, что мне нужно. Большое спасибо! Вместо tlsv1 я использовал «любой», и это тоже работает. (Кажется более безопасным, если я посещаю другие сайты ssl.
user1841243

1
поменять user-agent на какой?
Лукас Штеффен

15

У меня возникла та же проблема (casperjs 1.1.0-beta3 / phantomjs 1.9.7). Использование --ignore-ssl-errors = yes и --ssl-protocol = tlsv1 решило эту проблему. Использование только одного из вариантов для меня не решило.


Этот трюк устранил мою проблему с CI кодового кода, запустив пакет phantomjs + behat (после ~ 10 часов отладки и
тестирования

Да. после нескольких глупых часов ваш комментарий сделал мой день!
Яримадам

1

Я получал

Ошибка создания контекста SSL "из phantomJS (работает на CentOS 6.6)

Сборка из исходников исправила это для меня. Не забудьте использовать созданные фантомы. (вместо / usr / local / bin / phantomjs, если он у вас есть)

sudo yum -y install gcc gcc-c++ make flex bison gperf ruby openssl-devel freetype-devel fontconfig-devel libicu-devel sqlite-devel libpng-devel libjpeg-devel
git clone git://github.com/ariya/phantomjs.git
cd phantomjs
git checkout 2.0
./build.sh
cd bin/
./phantomjs <your JS file>

1
Не знаю, почему люди негативно оценивают ваш ответ. После попытки всех решений, упомянутых выше, и дней борьбы, это единственное решение, которое сработало для меня. phantomJS довольно утомительно компилировать из-за qt, но оно того стоит.
FlorianB

0

Если кто-то использует Phantomjs с Sahi, этот --ignore-ssl-errorsпараметр необходимо указать в вашем файле browser_types.xml. У меня это сработало.

<browserType>
    <name>phantomjs</name>
    <displayName>PhantomJS</displayName>
    <icon>safari.png</icon>
    <path>/usr/local/Cellar/phantomjs/1.9.2/bin/phantomjs</path>
    <options>--ignore-ssl-errors=yes --debug=yes --proxy=localhost:9999 /usr/local/Cellar/phantomjs/phantom-sahi.js</options>
    <processName>"PhantomJS"</processName>
    <capacity>100</capacity>
    <force>true</force>
</browserType>

0

Что о shebang ?

Если вы используете shebang для выполнения phantomjsскриптов, используйте следующую строку shebang

#!/usr/bin/phantomjs --ignore-ssl-errors=yes
    
var system = require('system');
var webpage = require('webpage');

// ... rest of your script

Используйте любой из приведенных выше ответов. --ignore-ssl-errors=yesМне лично нравится, поскольку не имеет значения проверять самозаверяющий сертификат моих петлевых веб-серверов.


0

Ни один из других ответов здесь мне не помог; может случиться так, что конкретные сайты, с которыми я работал, были слишком разборчивы в своих заголовках HTTP. Вот что сработало:

var page = webpage.create();
page.customHeaders = {
    "Connection": "keep-alive"
};

Я обнаружил, что PhantomJS использует Keep-Alive (с заглавной буквы), и соединение не поддерживается. :)


0

Получил SSL Handshake Failedвчера. Я перепробовал множество комбинаций параметров phantomJS (--ignore-ssl-errors=yes и т. Д.), Но ни один из них не работал.

Обновление до phantomJS 2.1.1 исправило это.

Я использовал инструкции по установке phantomJS на https://gist.github.com/julionc/7476620 , изменив версию phantomJS на 2.1.1.


0

На машине, на которой вы пытаетесь запустить phantomjs для подключения к удаленному серверу, запустите «openssl ciphers». Скопируйте и вставьте перечисленные шифры в параметр командной строки --ssl-ciphers = "". Это сообщает подключающемуся веб-серверу, какие шифры доступны для связи с вашим клиентом. Если вы не установите те, которые доступны на вашем собственном компьютере, он может использовать любой шифр, который ваша машина не понимает, что современные браузеры по умолчанию используют, которые используются для настройки по умолчанию.


-2

Единственное, что у меня сработало, это поднять phantomjs с 1.9x до 2.x;)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.