Ich portiere eine Anwendung von PHP / cURL nach Perl und LWP :: UserAgent. Ich muss eine POST-Anfrage an einen Webserver richten und ein Client-Zertifikat und eine Schlüsseldatei bereitstellen. Der PHP-Code, den ich versuche zu replizieren, ist dies:
%Vor%Und hier ist mein Perl-Code:
%Vor%Der PHP-Code verbindet sich erfolgreich mit dem Server, aber der Perl-Code schlägt fehl mit:
SSL-Lesefehlerfehler: 14094410: SSL-Routinen: SSL3_READ_BYTES: sslv3-Alert-Handshake-Fehler
Ich kann nicht herausfinden, was ich vermisse.
Die Antwort von emazep oben löste mein Problem. Ich verwende den Perl-Beispielcode von UPS, um über XML eine Verbindung mit dem Tarifservice herzustellen. Aus meinen Tests funktioniert das immer dann, wenn LWP :: UserAgent ohne Argumente aufgerufen wird, die Sie direkt steuern können. Dies ist praktisch, wenn Sie ein anderes Modul verwenden, das Anrufe an LWP für Sie durchführt. Verwenden Sie einfach Net :: SSL (zusätzlich zu den Paketen, die bereits LWP verwendet haben) und legen Sie einige Umgebungsvariablen fest:
%Vor%Das ist es! Sie sollten nicht einmal den Pfad zum Stammzertifikat Ihres Servers mit $ ENV {PERL_LWP_SSL_CA_FILE} angeben müssen.
Tatsächlich ist das ein unordentliches bisschen. Abhängig von Ihrer Konfiguration kann LWP :: UserAgent eines von (mindestens) zwei SSL-Modulen für die SSL-Verbindung verwenden.
Der erste sollte der Standard für neuere Versionen von LWP :: UserAgent sein. Sie können testen, welche davon installiert sind, indem Sie den Standardbefehl in einem Terminal für jedes Modul ausführen:
%Vor%IO :: socket :: SSL erfordert die SSL-Konfiguration mit dem ssl_opts wie in Ihrem Beispiel.
Net :: SSL erfordert die SSL-Konfiguration in Umgebungsvariablen wie in goddogsrunnings Antwort.
Ich persönlich bin in der zweiten Kategorie und hatte eine gute Inspiration von der Crypt :: SSLeay Seite . Vor allem der Abschnitt namens "CLIENT CERTIFICATE SUPPORT".
Tags und Links ssl perl openssl lwp lwp-useragent