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.