PhantomJS gagal membuka situs HTTPS

104

Saya menggunakan kode berikut berdasarkan contoh loadspeed.js untuk membuka situs https: // yang memerlukan otentikasi server http juga.

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();
    });
}  

Ini gagal memuat halaman sepanjang waktu. Apa yang salah di sini? Apakah situs yang diamankan akan ditangani secara berbeda? Situs ini berhasil diakses dari browser.

Saya baru memulai dengan Phantom sekarang dan merasa terlalu bagus untuk berhenti bermain-main meskipun saya tidak bergerak maju dengan masalah ini.

Sreerag
sumber

Jawaban:

153

Saya mencoba jawaban Fred dan Cameron Tinker, tetapi hanya --ssl-protocol = opsi apa pun yang tampaknya membantu saya:

phantomjs --ssl-protocol=any test.js

Juga saya pikir itu harus cara yang lebih aman untuk digunakan --ssl-protocol=anykarena Anda masih menggunakan enkripsi, tetapi --ignore-ssl-errors=trueakan mengabaikan (duh) semua kesalahan ssl, termasuk yang berbahaya.

JLarky
sumber
1
saya harus menggunakan 3 argumen ini dan diselesaikan: "--web-security = false", "--ssl-protocol = any", "--ignore-ssl-error = true". webdriver.PhantomJS (service_args = ['- ignore-ssl-error = true', "--web-security = false", "--ssl-protocol = any"])
Abdul Khalid
123

Masalahnya kemungkinan besar karena kesalahan sertifikat SSL. Jika Anda memulai phantomjs dengan opsi --ignore-ssl-error = yes , itu akan melanjutkan untuk memuat halaman seperti jika tidak ada kesalahan SSL:

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

Saya telah melihat beberapa situs web mengalami masalah dengan penerapan sertifikat SSL mereka yang salah atau telah kedaluwarsa, dll. Daftar lengkap opsi baris perintah untuk phantomjs tersedia di sini: http://phantomjs.org/api/command-line. html . Saya harap ini membantu.

Cameron Tinker
sumber
2
Terima kasih, ini juga menyelesaikan masalah saya. Kasus saya, saya tidak mendapatkan kesalahan Cert pada browser sehingga sangat membingungkan tetapi saya melakukan curl verbose dan memperhatikan bahwa salah satu yang tidak berfungsi adalah menggunakan Wildcard Cert (yaitu: CN = *. Example.com). Akan lebih baik jika phantomjs dapat mengembalikan alasan verbose mengapa ini gagal.
naoko
7
Monyet suci. Saya berharap kesalahan SSL dijelaskan, hanya tumpukan melimpah dan unicorn merah muda membantu saya melacak akar penyebabnya. Terima kasih teman
SimplGy
Senang ini membantu orang. Mungkin PhantomJS akan membutuhkan pembaruan untuk memberikan kesalahan SSL verbose dengan argumen baris perintah lain. Saya tahu bahwa informasi kesalahan SSL tersedia di Qt, tetapi kebanyakan orang hanya menyembunyikan kesalahan tanpa menanganinya secara eksplisit.
Cameron Tinker
Saya tahu saya terlambat ke permainan, tetapi saya menemukan bahwa menambahkan opsi setelah nama skrip tidak berfungsi - Anda harus memanggilnya secara berurutan:phantomjs --ignore-ssl-errors=yes script.js
simonlchilds
Ya, --ignore-ssl-errors=yesopsi harus ada sebelum nama skrip. Terima kasih telah menunjukkan hal ini.
Cameron Tinker
71

Perhatikan bahwa mulai 2014-10-16, PhantomJS secara default menggunakan SSLv3 untuk membuka koneksi HTTPS. Dengan kerentanan POODLE yang baru - baru ini diumumkan, banyak server menonaktifkan dukungan SSLv3.

Untuk menyiasatinya, Anda harus dapat menjalankan PhantomJS dengan:

phantomjs --ssl-protocol=tlsv1

Mudah-mudahan, PhantomJS akan segera diperbarui untuk menjadikan TLSv1 sebagai default, bukan SSLv3.

Mikha
sumber
4
Versi 1.9.8 mengalihkan default ke TLSv1: github.com/ariya/phantomjs/issues/12670
Andy Triggs
Memperbaiki untuk saya, SSLv3 dinonaktifkan di server
Chris Herring
2
Perhatikan bahwa memperbarui ke PhantomJS 1.9.8 menyebabkan bug baru .
Artjom B.
Ini harus menjadi jawaban yang diterima. Menonaktifkan SSL atau mengizinkan protokol apa pun bukanlah solusi yang baik menurut saya. Terima kasih telah berbagi.
Dominic P
3
Bagaimana saya bisa mendapatkan lebih banyak debugging verbose dari masalah handshake SSL?
wrschneider
24

mengalami masalah yang sama ...
--ignore-ssl-error = yes tidak cukup untuk memperbaikinya bagi saya, harus melakukan dua hal lagi:
1) ubah user-agent
2) coba semua ssl-protocols, satu-satunya yang berfungsi tlsv1 untuk halaman tersebut
Semoga ini bisa membantu ...

Fred
sumber
2
Mengganti protokol ssl ke tlsv1 juga berhasil untuk saya, terima kasih!
Dave Stibrany
1
+1 Memperbaiki masalah saya, beruntung Anda tidak di sini bersama saya karena saya akan mencium Anda sekarang lol, tepuk tangan
Martin
Inilah yang saya butuhkan. Terima kasih banyak! Alih-alih tlsv1 saya menggunakan "any" dan ini bekerja dengan baik. (tampaknya lebih aman jika saya mengunjungi situs web ssl lain.
user1841243
1
ubah agen pengguna menjadi apa?
Lucas Steffen
15

Saya mengalami masalah yang sama (casperjs 1.1.0-beta3 / phantomjs 1.9.7). Menggunakan --ignore-ssl-error = yes dan --ssl-protocol = tlsv1 menyelesaikannya. Menggunakan hanya satu opsi tidak menyelesaikannya bagi saya.

Jojje
sumber
Trik ini memperbaiki masalah saya pada codeship CI, menjalankan phantomjs + behat suite (setelah ~ 10 jam debugging dan mencoba sesuatu)
ZeNC
ya. setelah beberapa jam konyol komentar Anda membuat hari saya!
Yarimadam
1

Saya menerima

Kesalahan membuat konteks SSL "dari phantomJS (berjalan di CentOS 6.6)

Membangun dari sumber memperbaikinya untuk saya. Jangan lupa untuk menggunakan phantomjs yang Anda buat. (alih-alih / usr / local / bin / phantomjs jika Anda memilikinya)

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>
Mert Değirmenci
sumber
1
Saya tidak tahu mengapa orang menilai jawaban Anda secara negatif. Setelah mencoba semua solusi yang disebutkan di atas, dan hari-hari perjuangan, inilah satu-satunya solusi yang berhasil untuk saya. phantomJS cukup menjengkelkan untuk dikompilasi karena qt, tetapi itu sepadan.
FlorianB
0

Jika seseorang menggunakan Phantomjs dengan Sahi, --ignore-ssl-errorsopsi harus masuk ke file browser_types.xml Anda. Itu berhasil untuk saya.

<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>
ctasca.dll
sumber
0

Tentang apa shebang?

Jika Anda menggunakan shebang untuk mengeksekusi phantomjsskrip, gunakan baris shebang berikut

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

// ... rest of your script

Gunakan salah satu jawaban di atas. Saya pribadi suka --ignore-ssl-errors=yeskarena tidak relevan untuk memvalidasi sertifikat yang ditandatangani sendiri oleh server web loopback saya.

Jossef Harush
sumber
0

Tidak ada jawaban lain di sini yang membantu saya; mungkin situs tertentu yang saya kerjakan terlalu pilih-pilih dengan header HTTP-nya. Inilah yang berhasil:

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

Saya menemukan bahwa PhantomJS menggunakan "Keep-Alive" (huruf besar), dan koneksi tidak dipertahankan. :)

JstnPwll
sumber
0

Saya mendapatkan SSL Handshake Failedkemarin. Saya mencoba banyak kombinasi opsi phantomJS (--ignore-ssl-errors=yes dll.), Tetapi tidak ada yang berhasil.

Mengupgrade ke phantomJS 2.1.1 memperbaikinya.

Saya menggunakan petunjuk instalasi phantomJS di https://gist.github.com/julionc/7476620 , mengubah versi phantomJS ke 2.1.1.

VikR
sumber
0

Pada mesin tempat Anda mencoba menjalankan phantomjs untuk terhubung ke server jauh, jalankan "openssl ciphers." Salin dan tempel cipher yang terdaftar ke opsi baris perintah --ssl-ciphers = "". Ini memberi tahu server web yang menghubungkan cipher mana yang tersedia untuk digunakan untuk berkomunikasi dengan klien Anda. Jika Anda tidak menyetel yang tersedia di mesin Anda sendiri, itu dapat menggunakan sandi apa pun yang tidak dipahami mesin Anda yang dilakukan browser modern default yang digunakan untuk setelan default.

Bobby Edge
sumber
-2

Satu-satunya hal yang berhasil bagi saya adalah meningkatkan phantomjs dari 1.9x menjadi 2.x;)

giorgio79.dll
sumber