PhantomJS không mở được trang HTTPS


104

Tôi đang sử dụng mã sau đây dựa trên ví dụ loadpeed.js để mở trang web https: // cũng yêu cầu xác thực máy chủ 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();
    });
}  

Nó không thể tải trang mọi lúc. Điều gì có thể sai ở đây? Các trang web được bảo mật có được xử lý theo cách khác không? Trang web có thể được truy cập thành công từ trình duyệt.

Tôi chỉ mới bắt đầu với Phantom ngay bây giờ và thấy quá tốt để ngừng chơi xung quanh mặc dù tôi không tiếp tục với vấn đề này.

Câu trả lời:


153

Tôi đã thử các câu trả lời của Fred và Cameron Tinker, nhưng chỉ có --ssl-protocol = bất kỳ tùy chọn nào dường như giúp tôi:

phantomjs --ssl-protocol=any test.js

Ngoài ra, tôi nghĩ sẽ an toàn hơn khi sử dụng --ssl-protocol=anyvì bạn vẫn đang sử dụng mã hóa, nhưng --ignore-ssl-errors=truesẽ bỏ qua (duh) tất cả các lỗi ssl, bao gồm cả những lỗi độc hại.


1
tôi đã phải sử dụng 3 đối số này và nó đã giải quyết được: "--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

Sự cố rất có thể do lỗi chứng chỉ SSL. Nếu bạn bắt đầu phantomjs với tùy chọn --ignore -ssl-error = yes , nó sẽ tiến hành tải trang như cũ nếu không có lỗi SSL:

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

Tôi đã thấy một số trang web gặp sự cố với việc triển khai không chính xác chứng chỉ SSL của họ hoặc chúng đã hết hạn, v.v. Danh sách đầy đủ các tùy chọn dòng lệnh cho phantomjs có sẵn tại đây: http://phantomjs.org/api/command-line. html . Tôi hi vọng cái này giúp được.


2
Cảm ơn bạn, điều này cũng giải quyết vấn đề của tôi. Trường hợp của tôi, tôi không gặp lỗi Cert trên trình duyệt nên nó rất khó hiểu nhưng tôi đã đọc dài dòng và nhận thấy rằng một lỗi không hoạt động đang sử dụng Wildcard Cert (ví dụ: CN = *. Example.com). Sẽ rất tuyệt nếu phantomjs có thể trả lại lý do dài dòng về lý do tại sao điều này không thành công.
naoko

7
Khỉ chúa. Tôi ước gì lỗi SSL được giải thích, chỉ có lỗi tràn ngăn xếp và con kỳ lân màu hồng đã giúp tôi tìm ra nguyên nhân gốc rễ. Cảm ơn các bạn
SimplGy

Rất vui vì điều này giúp ích cho mọi người. Có lẽ PhantomJS sẽ cần một bản cập nhật để cung cấp các lỗi SSL dài dòng với một đối số dòng lệnh khác. Tôi biết rằng thông tin lỗi SSL có sẵn trong Qt, nhưng hầu hết mọi người chỉ loại bỏ lỗi mà không xử lý chúng một cách rõ ràng.
Cameron Tinker

Tôi biết tôi là muộn để các trò chơi, nhưng tôi thấy rằng việc thêm các tùy chọn sau khi tên kịch bản không làm việc - bạn cần phải gọi nó theo thứ tự:phantomjs --ignore-ssl-errors=yes script.js
simonlchilds

Có, --ignore-ssl-errors=yestùy chọn sẽ xuất hiện trước tên tập lệnh. Cảm ơn bạn đã chỉ ra điều này.
Cameron Tinker

71

Lưu ý rằng kể từ ngày 16 tháng 10 năm 2014, PhantomJS mặc định sử dụng SSLv3 để mở kết nối HTTPS. Với lỗ hổng POODLE được công bố gần đây, nhiều máy chủ đang vô hiệu hóa hỗ trợ SSLv3.

Để giải quyết vấn đề đó, bạn sẽ có thể chạy PhantomJS với:

phantomjs --ssl-protocol=tlsv1

Hy vọng rằng PhantomJS sẽ sớm được cập nhật để TLSv1 trở thành mặc định thay vì SSLv3.


4
Version 1.9.8 tắc mặc định để TLSv1: github.com/ariya/phantomjs/issues/12670
Andy Triggs

Cố định nó cho tôi, SSLv3 được vô hiệu hóa trên máy chủ
Chris Herring

2
Lưu ý rằng việc cập nhật lên PhantomJS 1.9.8 dẫn đến một lỗi mới .
Artjom B.

Đây phải là câu trả lời được chấp nhận. Theo tôi, tắt SSL hoặc cho phép bất kỳ giao thức nào không phải là giải pháp tốt. Cám ơn vì đã chia sẻ.
Dominic P

3
Làm cách nào để gỡ lỗi chi tiết hơn về các sự cố bắt tay SSL?
wrschneider

24

gặp phải vấn đề tương tự ...
--ignore-ssl-error = yes không đủ để khắc phục sự cố cho tôi, tôi phải làm thêm hai việc:
1) thay đổi user-agent
2) đã thử tất cả các giao thức ssl, giao thức duy nhất hoạt động là tlsv1 cho trang được đề cập
Hy vọng điều này sẽ giúp ...


2
Thay đổi giao thức ssl sang tlsv1 cũng hiệu quả với tôi, cảm ơn!
Dave Stibrany

1
1 Cố định vấn đề của tôi, may mắn bạn không phải ở đây với tôi như tôi sẽ hôn em ngay bây giờ lol, cheers
Martin

Đây chính xác là những gì tôi cần. Cảm ơn rât nhiều! Thay vì tlsv1, tôi đã sử dụng "any" và điều này cũng hoạt động. (có vẻ an toàn hơn một chút tôi nên ghé thăm trang web ssl khác.
user1841243

1
thay đổi tác nhân người dùng thành gì?
Lucas Steffen

15

Tôi đã gặp vấn đề tương tự (casperjs 1.1.0-beta3 / phantomjs 1.9.7). Sử dụng --ignore-ssl-error = yes và --ssl-protocol = tlsv1 đã giải quyết được vấn đề này. Chỉ sử dụng một trong các tùy chọn đã không giải quyết được vấn đề đó cho tôi.


Thủ thuật này cố định vấn đề của tôi trên codeship CI, chạy một phantomjs + behat bộ (sau ~ 10 giờ gỡ lỗi và thử mọi thứ)
ZeNC

vâng. sau một số giờ ngớ ngẩn bình luận của bạn làm cho ngày của tôi!
Yarimadam

1

Tôi đã nhận được

Lỗi tạo ngữ cảnh SSL "từ phantomJS (chạy trên CentOS 6.6)

Xây dựng từ nguồn đã sửa nó cho tôi. Đừng quên sử dụng các phantomjs mà bạn đã xây dựng. (thay vì / usr / local / bin / phantomjs nếu bạn có)

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
Tôi không biết tại sao mọi người lại đánh giá câu trả lời của bạn một cách tiêu cực. Sau khi thử tất cả các giải pháp nêu trên, và nhiều ngày đấu tranh, đây là giải pháp duy nhất phù hợp với tôi. phantomJS khá khó chịu khi biên dịch vì qt, nhưng nó đáng giá.
FlorianB

0

Nếu ai đó đang sử dụng Phantomjs với Sahi, --ignore-ssl-errorstùy chọn cần phải đi vào tệp browser_types.xml của bạn. Nó đã làm việc cho tôi.

<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

Về shebangthì sao?

Nếu bạn đang sử dụng shebang để thực thi phantomjscác tập lệnh, hãy sử dụng dòng shebang sau

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

// ... rest of your script

Sử dụng bất kỳ câu trả lời nào ở trên. cá nhân tôi thích --ignore-ssl-errors=yesvì việc xác thực chứng chỉ tự ký của máy chủ web loopback của tôi không liên quan.


0

Không có câu trả lời nào khác ở đây giúp tôi; có thể là (các) trang web cụ thể mà tôi đang làm việc quá kén chọn tiêu đề HTTP của chúng. Đây là những gì đã hoạt động:

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

Tôi phát hiện ra rằng PhantomJS đang sử dụng "Keep-Alive" (viết hoa) và kết nối không được duy trì. :)


0

Tôi đã nhận được SSL Handshake Failedngày hôm qua. Tôi đã thử nhiều cách kết hợp các tùy chọn phantomJS (--ignore-ssl-errors=yes v.v.), nhưng không ai trong số chúng hoạt động.

Nâng cấp lên phantomJS 2.1.1 đã sửa nó.

Tôi đã sử dụng hướng dẫn cài đặt phantomJS tại https://gist.github.com/julionc/7476620 , thay đổi phiên bản phantomJS thành 2.1.1.


0

Trên máy bạn đang cố gắng chạy phantomjs để kết nối với máy chủ từ xa, hãy chạy "mã hóa openssl". Sao chép và dán các mật mã được liệt kê vào tùy chọn dòng lệnh --ssl-ciphers = "". Điều này cho máy chủ web kết nối biết mã nào có sẵn để sử dụng để giao tiếp với ứng dụng khách của bạn. Nếu bạn không đặt những cái có sẵn trên máy của mình, nó có thể sử dụng bất kỳ mật mã nào mà máy của bạn không hiểu rằng các trình duyệt hiện đại mặc định làm được sử dụng cho cài đặt mặc định.


-2

Điều duy nhất hiệu quả với tôi là tăng phantomjs từ 1,9x lên 2,x;)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.