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

ฉันลองใช้คำตอบของ Fred และ Cameron Tinker แต่มีเพียง--ssl-protocol =ตัวเลือกใด ๆ ที่ดูเหมือนจะช่วยฉันได้:

phantomjs --ssl-protocol=any test.js

นอกจากนี้ฉันคิดว่าควรใช้วิธีที่ปลอดภัยกว่า--ssl-protocol=anyเนื่องจากคุณยังคงใช้การเข้ารหัส แต่--ignore-ssl-errors=trueจะเพิกเฉย (duh) ข้อผิดพลาด ssl ทั้งหมดรวมถึงข้อผิดพลาดที่เป็นอันตราย


1
ฉันต้องใช้ 3 อาร์กิวเมนต์นี้และมันได้รับการแก้ไข: "--web-security = false", "--ssl-protocol = any", "--ignore-ssl-error = true" webdriver.PhantomJS (service_args = ['- ไม่สนใจ -SSL-error = true', "--web-security = false", "--ssl-protocol = any"])
Abdul Khalid

123

ปัญหาน่าจะเกิดจากข้อผิดพลาดของใบรับรอง SSL หากคุณเริ่ม phantomjs ด้วยอ็อพชัน --ignore -ssl-error = yesก็ควรดำเนินการโหลดเพจต่อไปเหมือนเดิมหากไม่มีข้อผิดพลาด SSL:

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

ฉันเคยเห็นเว็บไซต์บางแห่งมีปัญหาในการนำใบรับรอง SSL ไปใช้อย่างไม่ถูกต้องหรือหมดอายุแล้วเป็นต้นรายการตัวเลือกบรรทัดคำสั่งทั้งหมดสำหรับ phantomjs มีอยู่ที่นี่: http://phantomjs.org/api/command-line HTML ฉันหวังว่านี่จะช่วยได้.


2
ขอบคุณสิ่งนี้ช่วยแก้ปัญหาของฉันได้เช่นกัน กรณีของฉันฉันไม่ได้รับข้อผิดพลาด Cert บนเบราว์เซอร์ดังนั้นมันจึงสับสนมาก แต่ฉันทำการ curl verbose และสังเกตว่าสิ่งที่ไม่ได้ผลคือการใช้ Wildcard Cert (เช่น: CN = *. example.com) คงจะดีไม่น้อยถ้า phantomjs สามารถแสดงเหตุผลแบบละเอียดว่าทำไมถึงล้มเหลว
naoko

7
ลิงศักดิ์สิทธิ์ ฉันหวังว่าจะมีการอธิบายข้อผิดพลาด SSL มีเพียงสแต็กโอเวอร์โฟลว์และยูนิคอร์นสีชมพูช่วยฉันติดตามสาเหตุที่แท้จริง ขอบคุณครับ
SimplGy

ดีใจที่ได้ช่วยเหลือผู้คน บางที PhantomJS อาจต้องการการอัปเดตเพื่อให้ข้อผิดพลาด SSL แบบละเอียดกับอาร์กิวเมนต์บรรทัดคำสั่งอื่น ฉันรู้ว่าข้อมูลข้อผิดพลาด SSL มีอยู่ใน Qt แต่บางครั้งผู้คนส่วนใหญ่ก็ระงับข้อผิดพลาดโดยไม่จัดการอย่างชัดเจน
Cameron Tinker

ฉันรู้ว่าฉันเล่นเกมช้า แต่ฉันพบว่าการเพิ่มตัวเลือกหลังจากชื่อสคริปต์ไม่ทำงานคุณต้องเรียกมันตามลำดับ:phantomjs --ignore-ssl-errors=yes script.js
simonlchilds

ใช่--ignore-ssl-errors=yesตัวเลือกควรมาก่อนชื่อสคริปต์ ขอขอบคุณที่ชี้ให้เห็น
Cameron Tinker

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
Andy Triggs

แก้ไขให้ฉัน SSLv3 ถูกปิดใช้งานบนเซิร์ฟเวอร์
Chris Herring

2
โปรดทราบว่าการปรับปรุง PhantomJS 1.9.8 นำไปสู่ข้อผิดพลาดใหม่
Artjom B.

นี่ควรเป็นคำตอบที่ได้รับการยอมรับ การปิด SSL หรืออนุญาตโปรโตคอลใด ๆ ไม่ใช่วิธีแก้ปัญหาที่ดีในความคิดของฉัน ขอบคุณสำหรับการแบ่งปัน.
Dominic P

3
ฉันจะแก้ไขข้อบกพร่องอย่างละเอียดมากขึ้นจากปัญหาการจับมือ SSL ได้อย่างไร
wrschneider

24

ประสบปัญหาเดียวกัน ...
--ignore-ssl-error = ใช่ไม่เพียงพอที่จะแก้ไขให้ฉันต้องทำอีกสองอย่าง:
1) เปลี่ยน user-agent
2) ลองใช้ ssl-protocol ทั้งหมดซึ่งเป็นโปรโตคอลเดียวที่ใช้งานได้ เป็น tlsv1 สำหรับหน้าที่มีปัญหา
หวังว่านี่จะช่วยได้ ...


2
การเปลี่ยน ssl-protocols เป็น tlsv1 ก็ใช้ได้เช่นกันขอบคุณ!
Dave Stibrany

1
+1 แก้ไขปัญหาของฉันโชคดีที่คุณไม่ได้อยู่ที่นี่กับฉันเพราะฉันจะจูบคุณตอนนี้ฮ่า ๆ เชียร์
มาร์ติน

นี่คือสิ่งที่ฉันต้องการ ขอบคุณมาก! แทนที่จะใช้ tlsv1 ฉันใช้ "any" และมันก็ใช้ได้เช่นกัน (ฉันควรไปที่เว็บไซต์ ssl อื่น ๆ ที่ปลอดภัยกว่าเล็กน้อย
user1841243

1
เปลี่ยน user-agent เป็นอะไร
Lucas Steffen

15

ฉันประสบปัญหาเดียวกัน (casperjs 1.1.0-beta3 / phantomjs 1.9.7) การใช้ --ignore-ssl-error = yes และ --ssl-protocol = tlsv1 แก้ไขได้ การใช้เพียงตัวเลือกเดียวไม่สามารถแก้ปัญหาได้สำหรับฉัน


เคล็ดลับนี้แก้ไขปัญหาของฉันเกี่ยวกับ CI CI โดยใช้ชุด phantomjs + behat (หลังจาก ~ 10 ชั่วโมงของการดีบักและทดลองใช้สิ่งต่างๆ)
ZeNC

ใช่. หลังจากเวลาโง่ ๆ ความคิดเห็นของคุณทำให้วันของฉัน!
Yarimadam

1

ฉันได้รับ

เกิดข้อผิดพลาดในการสร้างบริบท SSL "จาก phantomJS (ทำงานบน CentOS 6.6)

การสร้างจากแหล่งที่มาแก้ไขให้ฉัน อย่าลืมใช้ phantomjs ที่คุณสร้างขึ้น (แทน / 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 = "" สิ่งนี้จะบอกเว็บเซิร์ฟเวอร์ที่เชื่อมต่อว่ามีตัวเข้ารหัสใดบ้างที่สามารถใช้สื่อสารกับไคลเอ็นต์ของคุณได้ หากคุณไม่ได้ตั้งค่าที่มีอยู่ในเครื่องของคุณเองก็สามารถใช้การเข้ารหัสใดก็ได้ที่เครื่องของคุณไม่เข้าใจว่าเบราว์เซอร์สมัยใหม่เริ่มต้นนั้นใช้สำหรับการตั้งค่าเริ่มต้น


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.