PhantomJS kann die HTTPS-Site nicht öffnen


104

Ich verwende den folgenden Code basierend auf dem Beispiel loadloaded.js, um eine https: // Site zu öffnen, für die ebenfalls eine HTTP-Serverauthentifizierung erforderlich ist.

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

Die Seite kann nicht ständig geladen werden. Was könnte hier falsch sein? Sollen gesicherte Sites anders gehandhabt werden? Auf die Site kann jedoch erfolgreich über den Browser zugegriffen werden.

Ich fange gerade erst mit Phantom an und finde es zu gut, mit dem Herumspielen aufzuhören, obwohl ich mit diesem Problem nicht weiterkomme.

Antworten:


153

Ich habe die Antworten von Fred und Cameron Tinker ausprobiert, aber nur --ssl-protocol = jede Option scheint mir zu helfen:

phantomjs --ssl-protocol=any test.js

Ich denke auch, dass es viel sicherer sein sollte, --ssl-protocol=anyda Sie immer noch Verschlüsselung verwenden, aber --ignore-ssl-errors=truealle SSL-Fehler, einschließlich böswilliger, ignorieren (duh).


1
Ich musste diese 3 Argumente verwenden und es löste sich auf: "--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

Das Problem ist höchstwahrscheinlich auf SSL-Zertifikatfehler zurückzuführen. Wenn Sie phantomjs mit der Option --ignore-ssl-Errors = yes starten , sollte die Seite so geladen werden, als ob keine SSL-Fehler aufgetreten wären:

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

Ich habe einige Websites gesehen, die Probleme mit der falschen Implementierung ihrer SSL-Zertifikate haben oder abgelaufen sind usw. Eine vollständige Liste der Befehlszeilenoptionen für Phantomjs finden Sie hier: http://phantomjs.org/api/command-line. html . Ich hoffe das hilft.


2
Vielen Dank, dies hat auch mein Problem gelöst. In meinem Fall habe ich keinen Cert-Fehler im Browser erhalten, daher war es sehr verwirrend, aber ich habe mich ausführlich gewellt und festgestellt, dass Wildcard Cert (dh: CN = *. Example.com) nicht funktioniert hat. Es wäre schön, wenn Phantomjs einen ausführlichen Grund dafür zurückgeben könnten, warum dies fehlgeschlagen ist.
Naoko

7
Heilige Affen. Ich wünschte, der SSL-Fehler wäre erklärt worden, nur der Stapelüberlauf und das rosa Einhorn hätten mir geholfen, die Grundursache aufzuspüren. Vielen Dank Jungs
SimplGy

Ich bin froh, dass dies den Menschen hilft. Möglicherweise benötigt PhantomJS ein Update, um ausführliche SSL-Fehler mit einem anderen Befehlszeilenargument zu versehen. Ich weiß, dass SSL-Fehlerinformationen in Qt verfügbar sind, aber meistens unterdrücken die Leute die Fehler nur, ohne sie explizit zu behandeln.
Cameron Tinker

Ich weiß, dass ich zu spät zum Spiel komme, aber ich habe festgestellt, dass das Hinzufügen der Option nach dem phantomjs --ignore-ssl-errors=yes script.js
Skriptnamen

Ja, die --ignore-ssl-errors=yesOption sollte vor dem Skriptnamen stehen. Vielen Dank für den Hinweis.
Cameron Tinker

71

Beachten Sie, dass PhantomJS ab dem 16.10.2014 standardmäßig SSLv3 zum Öffnen von HTTPS-Verbindungen verwendet. Mit der kürzlich angekündigten POODLE-Sicherheitsanfälligkeit deaktivieren viele Server die SSLv3-Unterstützung.

Um dies zu umgehen, sollten Sie PhantomJS ausführen können mit:

phantomjs --ssl-protocol=tlsv1

Hoffentlich wird PhantomJS bald aktualisiert, um TLSv1 anstelle von SSLv3 zum Standard zu machen.


4
Version 1.9.8 schaltet die Standardeinstellung auf TLSv1 um: github.com/ariya/phantomjs/issues/12670
Andy Triggs

Es wurde für mich behoben, SSLv3 wurde auf dem Server deaktiviert
Chris Herring

2
Beachten Sie, dass das Aktualisieren auf PhantomJS 1.9.8 zu einem neuen Fehler führt .
Artjom B.

Dies sollte die akzeptierte Antwort sein. Das Deaktivieren von SSL oder das Zulassen eines Protokolls sind meiner Meinung nach keine guten Lösungen. Danke für das Teilen.
Dominic P

3
Wie kann ich SSL-Handshake-Probleme ausführlicher debuggen?
Wrschneider

24


Ich habe das gleiche Problem festgestellt ... --ignore-ssl-error = yes war nicht genug, um es für mich zu beheben. Ich musste zwei weitere Dinge tun:
1) Benutzer-Agent ändern
2) Alle SSL-Protokolle ausprobiert, das einzige, das funktionierte war tlsv1 für die betreffende Seite
Hoffe das hilft ...


2
Das Ändern von ssl-Protokollen auf tlsv1 hat auch bei mir funktioniert, danke!
Dave Stibrany

1
+1 Mein Problem wurde behoben, zum Glück bist du nicht hier bei mir, da ich dich jetzt küssen würde lol, Prost
Martin

Genau das brauchte ich. Vielen Dank! Anstelle von tlsv1 habe ich "any" verwendet und das funktioniert auch. (scheint ein bisschen sicherer, sollte ich andere SSL-Websites besuchen.
User1841243

1
Benutzer-Agent auf was ändern?
Lucas Steffen

15

Ich hatte das gleiche Problem (casperjs 1.1.0-beta3 / phantomjs 1.9.7). Mit --ignore-ssl-Errors = yes und --ssl-protocol = tlsv1 wurde das Problem behoben. Die Verwendung nur einer der Optionen hat es für mich nicht gelöst.


Dieser Trick hat mein Problem auf Codeship CI behoben, indem ich eine Phantomjs + Behat-Suite ausgeführt habe (nach ~ 10 Stunden Debuggen und Ausprobieren)
ZeNC

Ja. Nach ein paar dummen Stunden machte dein Kommentar meinen Tag!
Yarimadam

1

Ich erhielt

Fehler beim Erstellen des SSL-Kontexts "aus phantomJS (unter CentOS 6.6)

Das Bauen von der Quelle hat es für mich behoben. Vergessen Sie nicht, die von Ihnen erstellten Phantomjs zu verwenden. (anstelle von / usr / local / bin / phantomjs, falls vorhanden)

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
Ich weiß nicht, warum die Leute Ihre Antwort negativ bewerten. Nachdem ich alle oben genannten Lösungen und Tage des Kampfes ausprobiert habe, ist dies die einzige Lösung, die für mich funktioniert hat. Das Kompilieren von phantomJS ist aufgrund von qt ziemlich ärgerlich, aber es lohnt sich.
FlorianB

0

Wenn jemand Phantomjs mit Sahi verwendet, muss die --ignore-ssl-errorsOption in Ihre Datei browser_types.xml aufgenommen werden. Es hat bei mir funktioniert.

<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

Was ist mit shebang?

Wenn Sie Shebang zum Ausführen von phantomjsSkripten verwenden, verwenden Sie die folgende Shebang-Zeile

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

// ... rest of your script

Verwenden Sie eine der oben genannten Antworten. Ich persönlich mag es, --ignore-ssl-errors=yesda es irrelevant ist, das selbstsignierte Zertifikat meiner Loopback-Webserver zu validieren.


0

Keine der anderen Antworten hier hat mir geholfen; Es kann sein, dass die spezifischen Sites, mit denen ich gearbeitet habe, mit ihren HTTP-Headern zu wählerisch waren. Das hat funktioniert:

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

Ich fand heraus, dass PhantomJS "Keep-Alive" (groß geschrieben) verwendete und die Verbindung nicht am Leben gehalten wurde. :) :)


0

Ich wurde SSL Handshake Failedgestern. Ich habe viele Kombinationen von PhantomJS-Optionen ausprobiert (--ignore-ssl-errors=yes usw.) , aber keine davon hat funktioniert.

Ein Upgrade auf phantomJS 2.1.1 hat das Problem behoben.

Ich habe die Installationsanweisungen für phantomJS unter https://gist.github.com/julionc/7476620 verwendet und die phantomJS-Version auf 2.1.1 geändert.


0

Führen Sie auf dem Computer, auf dem Sie Phantomjs ausführen möchten, um eine Verbindung zu einem Remote-Server herzustellen, "openssl ciphers" aus. Kopieren Sie die aufgelisteten Chiffren und fügen Sie sie in die Befehlszeilenoption --ssl-ciphers = "" ein. Dies teilt dem verbindenden Webserver mit, welche Chiffren für die Kommunikation mit Ihrem Client verfügbar sind. Wenn Sie die auf Ihrem eigenen Computer verfügbaren nicht festlegen, kann eine beliebige Verschlüsselung verwendet werden. Ihr Computer versteht nicht, dass die modernen Standardbrowser für die Standardeinstellung verwendet werden.


-2

Das einzige, was für mich funktioniert hat, war die Erhöhung der Phantomjs von 1.9x auf 2.x;)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.