Gerd Christian Kunze: Hilfe? Mit PHP und CURL ein POST über HTTPS (SSL) versenden

Ich möchte mit CURL in PHP von meinem Server(1) aus ein POST (von XML Daten) auf einen anderen Server(2) ausführen. Dieser wiederum sendet mir dann eine Antwort, ebenfalls in XML. Soweit zur Theorie.

Irgendetwas scheint bei der Authentifizierung aber schief zu gehen.
Hier mal ein paar Daten (anonymisiert):

Der gesendete Test Header von Server(1):
Array
(
    [0] => POST /myservlet/mydirectory HTTP/1.1
    [1] => Host: https://my.server.com:443
    [2] => WWW-Authorization: Basic MY_BASE64_KEY
    [3] => Content-length: 801
    [4] => Content-Type: application/x-www-form-urlencoded
    [5] => Connection: close
)

Die Antwort(Header) vom Server(2)

HTTP/1.1 401 Unauthorized
connection: close
server: SAP J2EE Engine/6.40
www-authenticate: BASIC realm="Server_Realm"
set-cookie: saplb_*=(akrhp031_XI0_70)703778750; Version=1; Path=/
date: Wed, 17 Jan 2007 09:57:33 GMT

Die Frage ist nun was hier schiefgeht.

Eine generelle Verbindung ist möglich, solange ich CURLOPT_POST nicht verwende. Aber das ist es doch was ich will oder?

Ich habe dabei folgende CURL Optionen verwendet und in "allen möglichen" Kombinationen/Varianten ausprobiert:

CURLOPT_URL, CURLOPT_TIMEOUT, CURLOPT_USERAGENT, CURLOPT_FOLLOWLOCATION, CURLOPT_USERPWD, CURLOPT_PROXYUSERPWD, CURLOPT_SSL_VERIFYPEER, CURLOPT_SSL_VERIFYHOST, CURLOPT_POST, CURLOPT_CUSTOMREQUEST, CURLOPT_HTTPHEADER, CURLOPT_POSTFIELDS, CURLOPT_FAILONERROR, CURLOPT_HEADER, CURLOPT_VERBOSE, CURLOPT_RETURNTRANSFER

Falls das schonmal jemand erfolgreich implementiert hat und mir ein paar Codeschnipsel zukommen lassen könnte, wäre das sehr hilfreich.

Ich bin mit meinem Latein am Ende und für jeden Vorschlag dankbar.

MfG GCK

PS: Der Key ist richtig (besteht aus: base64_encode($this->str_auth_user.":".$this->str_auth_password);

  1. Irgendetwas scheint bei der Authentifizierung aber schief zu gehen.

    [2] => WWW-Authorization: Basic MY_BASE64_KEY

    Probiere es mal mit dem "etwas" bekannteren Authorization..

    1. Irgendetwas scheint bei der Authentifizierung aber schief zu gehen.

      [2] => WWW-Authorization: Basic MY_BASE64_KEY

      Probiere es mal mit dem "etwas" bekannteren Authorization..

      Hab ich auch schon probiert... ändert leider nix

      1. [2] => WWW-Authorization: Basic MY_BASE64_KEY

        Probiere es mal mit dem "etwas" bekannteren Authorization..

        Hab ich auch schon probiert... ändert leider nix

        Mit Verlaub, Du kannst nicht einfach irgendetwas erfinden, selbst wenn es wegen einer Ähnlichkeit naheliegt, nur weil es mit der standardisierten Methode nicht funktioniert. WWW-Authorization gibt es nicht, also wirst Du damit auch garantiert keinen Zugang bekommen.

        Wenn es vorher mit Authorization nicht funktionerte, dann hast Du noch einen anderen Fehler drin. Cheatah hat bereits darauf hingewiesen, dass Deine Verwendung von Host auch nicht im Sinne des Erfinders ist. Vergleiche mal das Beispiel aus dem Standard mit Deiner Verwendung.

        1. Ahoi... Ich brauche das ganze Headerzeuch nicht mehr, hatte mich nur bei einer Variable vertippt, jetzt generiert er ihn automatisch.. nach Standard ;)

          PS: WWW-Authorization gibt es sehr wohl, allerdings nur als Responseheader, als Request muss es, wie Cheatah sagt, Authorization sein nur versteht das curl falsch. Der braucht CURLOPT_USERPWD/CURLOPT_HTTPAUTH den Headerauth-Handshake ignoriert er gekonnt.

          Danke trotzdem für eure Antworten :)

          1. PS: WWW-Authorization gibt es sehr wohl, allerdings nur als Responseheader,

            Die Antwort auf Authorization heißt WWW-Authenticate, nicht WWW-Authorization.

            1. Die Antwort auf Authorization heißt WWW-Authenticate, nicht WWW-Authorization.

              Richtig... mein Fehler...

  2. Hi,

    [1] => Host: https://my.server.com:443

    Doppelpunkt und Slash sind in Hostnamen ungültig. Meinst Du "Host: https.my.server.com:443"?

    [2] => WWW-Authorization: Basic MY_BASE64_KEY
    Die Frage ist nun was hier schiefgeht.

    Du verschickst keinen Authorization-Header.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Was genau meinst du mit

      Du verschickst keinen Authorization-Header.

      Wie müsste es den aussehen, damit einer verschickt wird?

    2. Hallo Forum,

      Doppelpunkt und Slash sind in Hostnamen ungültig. Meinst Du "Host: https.my.server.com:443"?

      Meinst du "Host: https.my.server.com"?

      Der Port wird eine Ebene unter HTTP festgelegt, also im TCP-Packet.

      Gruß
      Alexander Brock

      1. Hallo Alexander,

        Doppelpunkt und Slash sind in Hostnamen ungültig. Meinst Du "Host: https.my.server.com:443"?

        Meinst du "Host: https.my.server.com"?

        Der Port wird eine Ebene unter HTTP festgelegt, also im TCP-Packet.

        Was aber nichts daran ändert, dass der HTTP-Standard vorschreibt, bei Nicht-Standard-Ports den Port mitzusenden, d.h. wenn HTTP verwendet wird und *kein* Port 80, so hat im Host-Header hostname:port zu stehen und wenn HTTPS verwendet wird und *kein* Port 443, so hat im Host-Header ebenfalls hostname:port zu stehen. Ferner ist die Angabe von hostname:port anstelle von hostname beim Standard-Port 443 für HTTPS nicht falsch, wenn auch unnötig.

        Viele Grüße,
        Christian

        --
        "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup