PhantomJS не вдалося відкрити сайт HTTPS


104

Я використовую наступний код на основі прикладу loadspeed.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-протокол = будь-який варіант:

phantomjs --ssl-protocol=any test.js

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


1
я повинен був використовувати ці 3 аргументи, і він вирішив: "--web-security = false", "--ssl-протокол = будь-який", "--ignore-ssl-error = true". webdriver.PhantomJS (service_args = ['- ignore-ssl-error = true', "--web-security = false", "--ssl-протокол = будь-який"])
Абдул Халід

123

Проблема, швидше за все, пов’язана з помилками сертифіката SSL. Якщо ви запускаєте phantomjs за допомогою параметра --ignore-ssl-errors = так , слід продовжити завантаження сторінки так, як це було б, якби не було помилок SSL:

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

Я бачив, що на кількох веб-сайтах виникають проблеми з неправильним впровадженням своїх SSL-сертифікатів або термін їх дії закінчився тощо. Повний список параметрів командного рядка для Phantomjs доступний тут: http://phantomjs.org/api/command-line. html . Я сподіваюся, що це допомагає.


2
Дякую, це вирішило і мою проблему. У моєму випадку я не отримав помилку Cert у браузері, тому це було дуже заплутано, але я скрутив багатослівний текст і помітив, що той, хто не працював, використовував 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

Зауважте, що станом на 10.10.2014, PhantomJS за замовчуванням використовує SSLv3 для відкриття HTTPS-з'єднань. З пудель вразливість недавно оголосила, багато сервери відключити підтримку SSLv3.

Щоб обійти це, ви повинні мати змогу запустити PhantomJS за допомогою:

phantomjs --ssl-protocol=tlsv1

Сподіваємось, PhantomJS скоро буде оновлений, щоб TLSv1 став типовим замість SSLv3.


4
Версія 1.9.8 перемикає за замовчуванням TLSv1: github.com/ariya/phantomjs/isissue/12670
Енді

Виправлено це для мене, SSLv3 був відключений на сервері
Chris Herring

2
Зауважте, що оновлення до PhantomJS 1.9.8 призводить до появи нових помилок .
Artjom B.

Це має бути прийнятою відповіддю. Вимкнення SSL або дозвіл будь-якого протоколу, на мою думку, не є гарним рішенням. Дякую, що поділились.
Домінік П

3
Як я можу отримати більш детальну налагодження з проблеми рукостискання з SSL?
wrschneider

24

випробував ту ж проблему ...
--ignore-ssl-error = так, було недостатньо, щоб виправити це для мене, довелося зробити ще дві речі:
1) змінити користувальницький агент
2) спробував усі протоколи ssl, єдиний, що працював був tlsv1 для сторінки, про яку йдеться.
Сподіваюся, що це допомагає ...


2
Зміна протоколів ssl на tlsv1 працювала і для мене, дякую!
Дейв Стібрані

1
+1 Виправлена ​​моя проблема, пощастило, що ти не зі мною тут, як я б поцілував тебе, хале, ура!
Мартін

Це саме те, що мені було потрібно. Велике спасибі! Замість tlsv1 я використав "будь-який", і це працює також. (здається трохи безпечнішим, якщо я відвідую інші веб-сайти ssl.
user1841243

1
змінити користувальницький агент на що?
Лукас Стеффен

15

У мене виникла та ж проблема (casperjs 1.1.0-beta3 / phantomjs 1.9.7). Використовуючи --ignore-ssl-помилки = так і --ssl-протокол = tlsv1 вирішив це. Використання лише одного з варіантів не вирішило це для мене.


Цей трюк вирішив мою проблему на CI-коді, запускаючи phantomjs + behat suite (після ~ 10 годин налагодження та випробування речей)
ZeNC

так. через кілька дурних годин ваш коментар зробив мій день!
Ярімадам

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 для підключення до віддаленого сервера, запустіть "шифри opensl". Скопіюйте та вставте шифри, перелічені у параметрі командного рядка --ssl-ciphers = "". Це повідомляє веб-серверу, що підключається, які шифри можна використовувати для спілкування з вашим клієнтом. Якщо ви не встановите ті, які доступні на вашій машині, він може використовувати будь-який шифр, на якому ваша машина не розуміє, що сучасні браузери за замовчуванням роблять, що використовуються для налаштування за замовчуванням.


-2

Єдине, що працювало для мене, - це підвищення фантомів з 1.9x до 2.x;)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.