ein curl-Abruf funktioniert nicht mehr

Hallo,

ich habe seit einigen Tagen in meinem Dyson-Modul einen Fehler, auf die Anmeldung antwortet er nur mitt HTTP 403 (also forbidden).

Da das ja schon seit vielen Monaten funktioniert bin ich etwas irritiert und habe meinen eigenen Code in Frage gestellt.

Daher habe ich versucht, das auf das wesentliche zu reduzieren

dieser curl-Aufruf funktioniert und liefert die erwartete Antwort.


curl -X POST -H "Content-Type: application/json" -k 'https://appapi.cp.dyson.com/v1/userregistration/authenticate?country=DE' -d '{"Email": "user@domain.xx", "Password": "<password>"}'
{"Account":"xxxx-yyyy-zzzz","Password":"lwglhglhwlhg=⇔"}

Dann habe ich mir das in php übersetzen lassen:


// Generated by curl-to-PHP: http://incarnate.github.io/curl-to-php/
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'https://appapi.cp.dyson.com/v1/userregistration/authenticate?country=DE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"Email": "user@domain.xx", "Password": "<password>"}');

$headers = array();
$headers[] = 'Content-Type: application/json';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
curl_close($ch);

echo 'result=' . $result . PHP_EOL;

das gibt folgenden Fehler

Error:SSL certificate problem: unable to get local issuer certificate

Also CURLOPT_SSL_VERIFYPEER hinzugefügt (wie in meinem Modul gemacht)


// Generated by curl-to-PHP: http://incarnate.github.io/curl-to-php/
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'https://appapi.cp.dyson.com/v1/userregistration/authenticate?country=DE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"Email": "user@domain.xx", "Password": "<password>"}');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

$headers = array();
$headers[] = 'Content-Type: application/json';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
curl_close($ch);

echo 'result=' . $result . PHP_EOL;

Antwort

result=error code: 1020

Dann nochmal einen url-Aufruf aus einem Script


$s = "curl -X POST -H \"Content-Type: application/json\" -k 'https://appapi.cp.dyson.com/v1/userregistration/authenticate?country=DE' -d '{\"Email\": \"user@domain.xx\", \"Password\": \"\<password>\"}'";
echo $s . PHP_EOL;

system($s);

ergibt

curl -X POST -H „Content-Type: application/json“ -k ‚https://appapi.cp.dyson.com/v1/userregistration/authenticate?country=DE‘ -d ‚{„Email“: „user@domain.xx“, „Password“: „<password>“}‘
{„Account“:„xxxx-yyyy-zzzz“,„Password“:„lwglhglhwlhg=⇔“}

also auch richtig.

Es ist egal, ob ich das als Script oder per Modul durchführe.

Test mit Symcon 5.5 stable (IP-Symcon 5.5, Ubuntu, 04.12.2020, f9de3bea4595) und 5.5 ninja (IP-Symcon 5.5, Raspberry Pi, 06.01.2021, 15f964b68d15).

Der Code wird nur in dem Dyson-Konfigurator verwendet und den Konfiguration rufe ich natürlich nicht so häufig auf.
Insofern kann ich nicht genau sagen, wie lange das nicht funktioniert; das hat aber bislang bei mir und natürlich den Anwendern des Dyson-Moduls geklappt.

Ich habe leider keine 5.4 mehr zur Hand um das zu testen, sonst würde ich einen pi nochmal in der alten Version aufsetzen, um das Verhalten zu prüfen.

Hat irgend jemand eine Idee, was da nicht funktioniert?

Danke & Gruß
demel

Hallo,
es wäre sinnvoll du würdest das Stammzertifikat „DigiCert Global Root CA“ in Symcon importieren. Dafür die Webseite im Browser öffnen und herunterladen. Symcon hat seine eigene Stammzertifikatsdatei /usr/share/symcon/cacert.pem dort musst du das Zertifikat hinten anhängen.

Hallo,
vielen Dank für den Tip,

Ich habe direkt mal nachgeschaut, in meiner cacert.pem war schon u.a. ein „DigiCert Global Root CA“ (neben vielen anderen Zertifikaten) enthalten.

Um zu vergleichen, ob das das richtigen ist, welche Webseite meinst Du genau?
Ich habe hier gesucht und das DigiCert_Global_Root_CA.pem geholt. Das stimm auf jeden Fall mit dem bereits vorhandenen überein
Gruß
demel

Die Api Webseite https://appapi.cp.dyson.com meldet im Browser eine leere Seite. Das Zertifikat ist aber das selbe wie per CURL. Seriennummer 08:3B:E0:56:90:42:46:B1:A1:75:6A:C9:59:91:C7:4A

Zudem würde ich dann das Zwischenzertifkat „DigiCert SHA2 Secure Server CA“ Seriennummer: 01:FD:A3:EB:6E:CA:75:C8:88:43:8B:72:4B:CF:BC:91
importieren.

Was auch jeder User welcher das Modul benutzt macht, schon klar. :wink:
Das wird aber nicht das Problem lösen.
Die API meldet 1020 zurück.
Mehr nicht? Nicht das die Konsole hier HTML filtert und dadurch eine lesbare Fehlermeldung verdeckt.
Dann wäre da noch das Passwort, welches da einfach in den String eingefügt wird.
Was jetzt wenn im Passwort Zeichen enthalten sind, welche für json maskiert werden müssen?
Eventuell besser hier ein Array zu bauen und dass dann mit json_encode in den Header zu werfen.
Michael

Ich habe nicht komplett gelesen. Dass beim deaktivieren der Zertifikatsprüfung Daten kommen zeigt aber, dass die Kommunikation am Zertifikat liegt. Es ist VERBOTEN die Zertifikatsprüfung zu überspringen. Dann kann ich bei öffentlichen Gegenstellen auch direkt darauf verzichten. Man könnte höchstens das Zertifikat selber mitliefern.


$certificate = "C:\wamp\cacert.pem";
curl_setopt($ch, CURLOPT_CAINFO, $certificate);
curl_setopt($ch, CURLOPT_CAPATH, $certificate);

Die Seriennummer des ersten Zertifikats stimmt überein , das zweite Zertifikat (DigiCert SHA2 Secure Server CA) habe ich in die Datei eingebaut.
Muss ich dann noch etwas machen? So hatte noch keine Änderung gebracht

Gruß
demel

Nein, das ist alles, keine HTML-Filter oder ähnliches.

so mache ich das auch im Modul, aber ich dachte für das Testscript nehme ich mal das, was das curl2php-converter liefert.
Gerde umgebaut -> keine Änderung, Habe mir auch den json-encoded-script angeschaut, da ist nichts kodiert.

gruß
demel

ich habe den curl-Aufruf ergänzt


$certificate = "/usr/share/symcon/cacert.pem"; 
curl_setopt($ch, CURLOPT_CAINFO, $certificate); 
curl_setopt($ch, CURLOPT_CAPATH, $certificate);

bei Aufruf eingefügt, gibt weiterhin den Fehler

Error:SSL certificate problem: unable to get local issuer certificate

Gruß
demel

Auf die Diskussion, das man eine Prüfung für externe Dienste nicht deaktiviert, lasse ich mich nicht ein. Das ist schon selbstverständlich. Und wenn dann hier ein Problem mit Stammzertifikaten vorliegt, sollte das eh Symcon fixen.

Mir ging es hier grundsätzlich um die Funktion. Und das deaktivieren der Prüfung ist dahingehend egal, da dass Ergebnis nur lokal ausgewertet wird.
Michael

;eider bin ic hier nicht viel weiter gekommen.

Es ist definitiv ein Problem mit der url-Kommunikation, da jeder Fehler (auch ein völlig willkürlicher Inhalt der POST-Data) ergibt eine qualifizierte Fehlermeldung und nicht diesen Error-Text und http-Error 403

Ich habe mal den Output der shell-curl hier dokumentiert (zu HTTP1/1 später)

$ curl -X POST -H „Content-Type: application/json“ -k ‚https://appapi.cp.dyson.com/v1/userregistration/authenticate?country=DE‘ -d ‚{„Email“:„x@y“,„Password“:„zzz“}‘ --http1.1 -v
Note: Unnecessary use of -X or --request, POST is already inferred.

  • Trying 104.18.171.223…
  • TCP_NODELAY set
  • Connected to appapi.cp.dyson.com (104.18.171.223) port 443 (#0)
  • ALPN, offering http/1.1
  • successfully set certificate verify locations:
  • CAfile: /etc/ssl/certs/ca-certificates.crt
    CApath: /etc/ssl/certs
  • TLSv1.3 (OUT), TLS handshake, Client hello (1):
  • TLSv1.3 (IN), TLS handshake, Server hello (2):
  • TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
  • TLSv1.3 (IN), TLS handshake, Unknown (8):
  • TLSv1.3 (IN), TLS handshake, Certificate (11):
  • TLSv1.3 (IN), TLS handshake, CERT verify (15):
  • TLSv1.3 (IN), TLS handshake, Finished (20):
  • TLSv1.3 (OUT), TLS change cipher, Client hello (1):
  • TLSv1.3 (OUT), TLS Unknown, Certificate Status (22):
  • TLSv1.3 (OUT), TLS handshake, Finished (20):
  • SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
  • ALPN, server accepted to use http/1.1
  • Server certificate:
  • subject: C=GB; L=Malmesbury; O=Dyson Limited; CN=*.dyson.com
  • start date: Oct 8 00:00:00 2020 GMT
  • expire date: Oct 23 12:00:00 2021 GMT
  • issuer: C=US; O=DigiCert Inc; CN=DigiCert SHA2 Secure Server CA
  • SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
  • TLSv1.3 (OUT), TLS Unknown, Unknown (23):
    > POST /v1/userregistration/authenticate?country=DE HTTP/1.1
    > Host: appapi.cp.dyson.com
    > User-Agent: curl/7.58.0
    > Accept: /
    > Content-Type: application/json
    > Content-Length: 57
    >
  • upload completely sent off: 57 out of 57 bytes
  • TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
  • TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
  • TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
  • TLSv1.3 (IN), TLS Unknown, Unknown (23):
    < HTTP/1.1 200 OK
    < Date: Sat, 16 Jan 2021 16:10:18 GMT
    < Content-Type: application/json; charset=utf-8
    < Content-Length: 152
    < Connection: keep-alive
    < Cache-Control: no-cache
    < Pragma: no-cache
    < Expires: -1
    < Authorization: Basic tttt=
    < CF-Cache-Status: DYNAMIC
    < cf-request-id: 07ad8f446f0000cdb7091a1000000001
    < Server: cloudflare
    < CF-RAY: 61291b1a4e01cdb7-CDG
    <
  • Connection #0 to host appapi.cp.dyson.com left intact
    {„Account“:„aaa“,„Password“:„ppp“}

So sieht der PHP-Code jetzt aus


<?php

declare(strict_types=1);

$postdata = [
        'Email' => 'x@y',
        'Password' => 'zzz',
];
echo 'postdata=' . $postdata . PHP_EOL;

$headers = [
    'Accept: */*',
    'Content-Type: application/json',
    'Content-Length: ' . strlen($postdata)
];
echo 'headers=' . print_r($headers, true) . PHP_EOL;

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'https://appapi.cp.dyson.com/v1/userregistration/authenticate?country=DE');

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);

curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2);
curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_MAX_DEFAULT);

curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);

$cdata = curl_exec($ch);
$cerrno = curl_errno($ch);
$cerror = $cerrno ? curl_error($ch) : '';
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

echo 'CURLINFO_HEADER_OUT=' . curl_getinfo($ch, CURLINFO_HEADER_OUT) . PHP_EOL;
echo 'CURLINFO_HTTP_VERSION=' . curl_getinfo($ch, CURLINFO_HTTP_VERSION) . PHP_EOL;
echo 'CURLINFO_PROTOCOL=' . curl_getinfo($ch, CURLINFO_PROTOCOL) . PHP_EOL;

var_dump(curl_getinfo($ch)) . PHP_EOL;

curl_close($ch);

echo PHP_EOL;
echo 'cerrno=' . $cerrno, '(' . $cerror . '), httpcode=' . $httpcode . ', cdata=' . $cdata . PHP_EOL;

ergibt dieses Ergebnis

postdata={„Email“:„x@y.y“,„Password“:„zzz“}
headers=Array
(
[0] => Accept: /
[1] => Content-Type: application/json
[2] => Content-Length: 57
)

CURLINFO_HEADER_OUT=POST /v1/userregistration/authenticate?country=DE HTTP/1.1
Host: appapi.cp.dyson.com
Accept: /
Content-Type: application/json
Content-Length: 57

CURLINFO_HTTP_VERSION=2
CURLINFO_PROTOCOL=2
array(38) {
[„url“]=>
string(71) „https://appapi.cp.dyson.com/v1/userregistration/authenticate?country=DE
[„content_type“]=>
string(25) „text/plain; charset=UTF-8“
[„http_code“]=>
int(403)
[„header_size“]=>
int(415)
[„request_size“]=>
int(211)
[„filetime“]=>
int(-1)
[„ssl_verify_result“]=>
int(0)
[„redirect_count“]=>
int(0)
[„total_time“]=>
float(0,151871)
[„namelookup_time“]=>
float(0,002978)
[„connect_time“]=>
float(0,04956)
[„pretransfer_time“]=>
float(0,095061)
[„size_upload“]=>
float(57)
[„size_download“]=>
float(16)
[„speed_download“]=>
float(105)
[„speed_upload“]=>
float(377)
[„download_content_length“]=>
float(16)
[„upload_content_length“]=>
float(57)
[„starttransfer_time“]=>
float(0,151814)
[„redirect_time“]=>
float(0)
[„redirect_url“]=>
string(0) „“
[„primary_ip“]=>
string(14) „104.18.171.223“
[„certinfo“]=>
array(0) {
}
[„primary_port“]=>
int(443)
[„local_ip“]=>
string(14) „iii.iii.iii.iii“
[„local_port“]=>
int(49194)
[„http_version“]=>
int(2)
[„protocol“]=>
int(2)
[„ssl_verifyresult“]=>
int(0)
[„scheme“]=>
string(5) „HTTPS“
[„appconnect_time_us“]=>
int(95009)
[„connect_time_us“]=>
int(49560)
[„namelookup_time_us“]=>
int(2978)
[„pretransfer_time_us“]=>
int(95061)
[„redirect_time_us“]=>
int(0)
[„starttransfer_time_us“]=>
int(151814)
[„total_time_us“]=>
int(151871)
[„request_header“]=>
string(154) "POST /v1/userregistration/authenticate?country=DE HTTP/1.1
Host: appapi.cp.dyson.com
Accept: /
Content-Type: application/json
Content-Length: 57

"
}

cerrno=0(), httpcode=403, cdata=HTTP/1.1 403 Forbidden
Date: Sat, 16 Jan 2021 16:08:55 GMT
Content-Type: text/plain; charset=UTF-8
Content-Length: 16
Connection: keep-alive
X-Frame-Options: SAMEORIGIN
Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Expires: Thu, 01 Jan 1970 00:00:01 GMT
cf-request-id: 07ad8dffd30000089710902000000001
Server: cloudflare
CF-RAY: 61291912efe70897-CDG

error code: 1020

Da ich im shell-curl gesehen hatte, das er eigentlich HTTP2 und TLS1.3 verwendete, hatte ich in PHO versucht, darauf zu Forcen.
Leider hatte ich damit keinen Erfolg, manisch, das er trotzdem HTTP1/1 verwendet. die Verschlüsslung kann ich nicht erkennen.

Habe daher die shell-curl auch mal auf HTTP1.1 geforced, das hat dort funktioniert. Leider kann ich keine keine Verschlüsslung < TSL einstellen, das curl sich weigert.

Der request-Header ist bei beiden Vorgehenseisen (shell vs. php) identisch, da kann es m.E: nicht dran liegen.

Das Passwort hatte ich auch temporär so schlicht gemacht, das da keinerlei Sonderzeichen etc drin waren - keine Änderung.

Grübel, grübel
demel

Ich befürchte es liegt daran, dass die Seite eine unvollständige SSL Zertifikatskette hat: SSL Server Test: appapi.cp.dyson.com (Powered by Qualys SSL Labs)

Wenn du diese URL hier per PHP ziehen willst, bekommst du den selben Fehler: https://incomplete-chain.badssl.com/

Das liegt daran, dass cURL im Vergleich zum PHP cURL das fehlende Zertifikat per AIA nachladen kann.

In der cacert.pem sind nur die Roots definiert. Die Intermediates muss normalerweise der WebServer von Dyson liefern.

paresy

Hallo paresy,

so ganz bin ich bei den Zertifikaten nicht fit.

Ich habe nun folgendes gemacht:

  1. im Firefox die API-URL aufgerufen (https://appapi.cp.dyson.com/v1/userregistration/authenticate?country=de)
    der meckert zwar, das da keine Valide XML-Antwort ist, aber sonst ist der Browser „zufrieden“
  2. bin ich auch das „Schloss“ gegangen

den Rechtspfeil (hinter „Verbindung ist sicher“) gewählt

„weitere Informationen“ ausgewählt

dann „Zerttifikat anzeigen“ auslösen

der wechselt dann auf eine andere Seite

hier habe ich im Reiter *.dyson.com das PEM (Zertifikat) geladen

  1. diese Datei habe ich an /usr/share/symcon/cacert.pem angehängt.

  2. ich habe dann im IPS das Test-Script aufgerufen


<?php

declare(strict_types=1);

$url = 'https://appapi.cp.dyson.com/v1/userregistration/authenticate?country=DE';

$postdata = [
        'Email' => 'a@b.c',
        'Password' => 'pp',
];
$postdata = json_encode($postdata);

$headers = [
    'Accept: */*',
    'Content-Type: application/json',
    'Content-Length: ' . strlen($postdata)
];

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);

$cdata = curl_exec($ch);
$cerrno = curl_errno($ch);
$cerror = $cerrno ? curl_error($ch) : '';
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

// var_dump(curl_getinfo($ch));

curl_close($ch);

echo 'cerrno=' . $cerrno, '(' . $cerror . '), httpcode=' . $httpcode . ', cdata=' . $cdata . PHP_EOL;

… leider keine Änderung

Muss ich noch etwas machen, damit das funktioniert? Muss ich die Änderung in cacert.pem irgendwie aktivieren?

Danke
demel

Hänge mal die beiden DigiCert CA Zertifikate auch an die IPS cacert.pem an und starte IPS neu. Das *.dyson Zertifikat ist eigentlich an der Stelle falsch, weil das kein CA Zertifikat ist. Sollte aber auch nicht stören.

Hallo,

habe ich gemacht, von der o.g. Seite im Firefox sowohl das DigiCert Global Root CA als auch das DigiCert SHA2 Secure Server CA heruntergeladen und in /ustr/share/symcon/cacert.pem eingetragen, IPS gestartet.

Leider kein Erfolg.

Die beiden Zertifikate waren übriges bereits schon in cacert.pem vorhanden

Habe alle 3 Zertifikat wieder entfernt …

demel

Hm, eigentlich sollte das aber tun.
Auf meinem IPS raspberry mit openssl getestet.
Initial ist die Verbindung fehlerhaft


/usr/share/symcon> openssl s_client  -connect appapi.cp.dyson.com:443 -CAfile ./cacert.pem
....
Verify return code: 21 (unable to verify the first certificate)

Ich habe dann nur das Digicert SHA2 CA Zertifikat ans Ende dazu getan


-----BEGIN CERTIFICATE-----
MIIElDCCA3ygAwIBAgIQAf2j627KdciIQ4tyS8+8kTANBgkqhkiG9w0BAQsFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0xMzAzMDgxMjAwMDBaFw0yMzAzMDgxMjAwMDBaME0xCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxJzAlBgNVBAMTHkRpZ2lDZXJ0IFNIQTIg
U2VjdXJlIFNlcnZlciBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
ANyuWJBNwcQwFZA1W248ghX1LFy949v/cUP6ZCWA1O4Yok3wZtAKc24RmDYXZK83
nf36QYSvx6+M/hpzTc8zl5CilodTgyu5pnVILR1WN3vaMTIa16yrBvSqXUu3R0bd
KpPDkC55gIDvEwRqFDu1m5K+wgdlTvza/P96rtxcflUxDOg5B6TXvi/TC2rSsd9f
/ld0Uzs1gN2ujkSYs58O09rg1/RrKatEp0tYhG2SS4HD2nOLEpdIkARFdRrdNzGX
kujNVA075ME/OV4uuPNcfhCOhkEAjUVmR7ChZc6gqikJTvOX6+guqw9ypzAO+sf0
/RR3w6RbKFfCs/mC/bdFWJsCAwEAAaOCAVowggFWMBIGA1UdEwEB/wQIMAYBAf8C
AQAwDgYDVR0PAQH/BAQDAgGGMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYY
aHR0cDovL29jc3AuZGlnaWNlcnQuY29tMHsGA1UdHwR0MHIwN6A1oDOGMWh0dHA6
Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RDQS5jcmwwN6A1
oDOGMWh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RD
QS5jcmwwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8v
d3d3LmRpZ2ljZXJ0LmNvbS9DUFMwHQYDVR0OBBYEFA+AYRyCMWHVLyjnjUY4tCzh
xtniMB8GA1UdIwQYMBaAFAPeUDVW0Uy7ZvCj4hsbw5eyPdFVMA0GCSqGSIb3DQEB
CwUAA4IBAQAjPt9L0jFCpbZ+QlwaRMxp0Wi0XUvgBCFsS+JtzLHgl4+mUwnNqipl
5TlPHoOlblyYoiQm5vuh7ZPHLgLGTUq/sELfeNqzqPlt/yGFUzZgTHbO7Djc1lGA
8MXW5dRNJ2Srm8c+cftIl7gzbckTB+6WohsYFfZcTEDts8Ls/3HB40f/1LkAtDdC
2iDJ6m6K7hQGrn2iWZiIqBtvLfTyyRRfJs8sjX7tN8Cp1Tm5gr8ZDOo0rwAhaPit
c+LJMto4JQtV05od8GiG7S5BNO98pVAdvzr508EIDObtHopYJeS4d60tbvVS3bR0
j6tJLp07kzQoH3jOlOrHvdPJbRzeXDLz
-----END CERTIFICATE-----


 /usr/share/symcon> openssl s_client  -connect appapi.cp.dyson.com:443 -CAfile ./cacert.pem
...
Verify return code: 0 (ok)


Deinen PHP Code konnte ich natürlich mangels eigenen Account nicht testen

Hallo,

für den Code brauchst Du keinen Account, denn es kommt dann eine json-codierte Fehlermeldung, wenn zB der User nicht bekannt ist. Hier kommt aber ja ein http-code 403.

Ich habe aber das Gefühl, das die Diskussion, auch die Antwort von paresy, sich nur mit dem Aspekt des SSL-Zertifikates auseinander setzt. Das Problem hatte ich erst umgangen, indem ich die SSL-Prüfung deaktiviert hatte, später hatte ich ja das DigiCert SHA2 Secure Server CA bereits hinzugefügt und konnte so auf CURLOPT_SSL_VERIFYPEER verzichten.

Trotzdem kommt ja nicht die gleiche Antwort wie bei dem shell-curl Aufruf.

demel

Hm, 403 ist „verboten“ (falscher User, falsches Password, falscher Client…)
https://developer.mozilla.org/de/docs/Web/HTTP/Status/403

Hallo,
hast du mal den Useragent getestet, den mit curl, php-curl verglichen? z.B in simpel mit dieser Seite: https://ifconfig.me/ua
Enthält das Passwort vielleicht Sonderzeichen, die PHP bei der Übergabe an CURL miss-interpretiert?

Hallo,

naja, das 403 Forbidden bedeutet, ist ja klar (siehe mein erster post), aber hier wird offensichtlich die Authentifizierung anders zurückgemeldet

bei korrektem Aufruf

curl -X POST -H "Content-Type: application/json" -k 'https://appapi.cp.dyson.com/v1/userregistration/authenticate?country=DE' -d '{"Email": "maine_mailadresse", "Password": "mein_password"}'

ergibt diese Antwort

{„Account“:„xxxx-yyyy-zzzz“,„Password“:„lwglhglhwlhg=⇔“}

curl -X POST -H "Content-Type: application/json" -k 'https://appapi.cp.dyson.com/v1/userregistration/authenticate?country=DE' -d '{"Email": "unbekannter__user", "Password": "falsches_passwort"}'

ergibt das

{„Message“:„Unable to authenticate user.“}

demel