https://d226lax1qjow5r.cloudfront.net/blog/blogposts/curl-https-nexmo-sms-api-behind-the-scenes-dr/featured-img_http-curl-nexmo.png

cURL, HTTPS und die Nexmo SMS API - Hinter den Kulissen

Zuletzt aktualisiert am May 4, 2021

Lesedauer: 14 Minuten

Das Versenden einer SMS mit der Nexmo API ist so einfach wie eine Anfrage an die URL: https://rest.nexmo.com/sms/json. Aber haben Sie sich jemals gefragt, was hinter den Kulissen passiert? Was macht Ihr Computer, wenn Sie etwas aus dem Internet anfordern? Was macht der Server?

Diese Fragen wollen wir im Folgenden beantworten, also folgen Sie uns, wenn Sie sich selbst ein Bild machen wollen.

Bevor wir beginnen

Bevor wir beginnen, brauchen Sie ein paar Dinge:

  • Die cURL Kommandozeilentool zum Senden und Empfangen von Daten.

Vonage API-Konto

Um dieses Tutorial durchzuführen, benötigen Sie ein Vonage API-Konto. Wenn Sie noch keines haben, können Sie sich noch heute anmelden und mit einem kostenlosen Guthaben beginnen. Sobald Sie ein Konto haben, finden Sie Ihren API-Schlüssel und Ihr API-Geheimnis oben auf dem Vonage-API-Dashboard.

Die https-Anfrage mit cURL stellen

Das Senden einer https Anfrage an die Nexmo SMS API ist ganz einfach. Ersetzen Sie einfach die folgenden Variablen im untenstehenden Beispiel, und die Nachricht sollte auf dem Weg sein.

KEY DESCRIPTION
NEXMO_KEY Your Nexmo API key, shown in your account overview.
NEXMO_SECRET Your Nexmo API secret, shown in your account overview.
TO_NUMBER The number you are sending the SMS to in E.164 format. For example 447401234567.
SENDER_ID The number or text shown on a handset when it displays your message. You can set a custom Alphanumeric SENDER_ID to represent your brand better if this feature is supported in your country.
curl "https://rest.nexmo.com/sms/json" \ -d "api_key=NEXMO_KEY" \ -d "api_secret=NEXMO_SECRET" \ -d "to=TO_NUMBER" \ -d "from=SENDER_ID" \ -d "text=A text message sent using the Nexmo SMS API" \ -v --trace-time

Sie können curl mit folgenden Optionen aufrufen Befehlszeilenoptionen aufrufen, um die URL(s) zu begleiten. Diese Optionen geben Informationen darüber an curl weiter, wie es sich verhalten soll.

Die Nexmo-Dokumentation verwendet -d um Zeichenketten von Daten in einer POST-Anfrage an einen Server zu senden, und wir fügen -v/--verbose um den ausführlichen Modus einzuschalten.

Letzteres ermöglicht es uns, die zusätzlichen Informationen zu sehen, die uns von den curl-Interna gegeben werden, zusammen mit allen Headern, die es sendet und empfängt. Außerdem wird --trace-time damit cURL allen ausführlichen Ausgaben einen hochauflösenden Timer für den Zeitpunkt des Ausdrucks der Zeile voranstellt.

Werfen wir nun einen Blick auf die Ausgabe:

00:12:04.170951 * Trying 173.193.199.22... 00:12:04.171716 * TCP_NODELAY set 00:12:04.476802 * Connected to rest.nexmo.com (173.193.199.22) port 443 (#0) 00:12:06.208221 * TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 00:12:06.208596 * Server certificate: *.nexmo.com 00:12:06.208889 * Server certificate: DigiCert SHA2 Secure Server CA 00:12:06.209038 * Server certificate: DigiCert Global Root CA 00:12:06.209288 > POST /sms/json HTTP/1.1 00:12:06.209288 > Host: rest.nexmo.com 00:12:06.209288 > User-Agent: curl/7.54.0 00:12:06.209288 > Accept: */* 00:12:06.209288 > Content-Length: 124 00:12:06.209288 > Content-Type: application/x-www-form-urlencoded 00:12:06.209288 > 00:12:06.209560 * upload completely sent off: 124 out of 124 bytes 00:12:06.412178 < HTTP/1.1 200 OK 00:12:06.412243 < Server: nginx 00:12:06.412279 < Date: Tue, 03 Apr 2018 23:12:07 GMT 00:12:06.412314 < Content-Type: application/json 00:12:06.412353 < Transfer-Encoding: chunked 00:12:06.412447 < Connection: keep-alive 00:12:06.412520 < Cache-Control: max-age=1 00:12:06.412629 < X-Frame-Options: deny 00:12:06.412681 < X-XSS-Protection: 1; mode=block; 00:12:06.412732 < Strict-Transport-Security: max-age=31536000; includeSubdomains 00:12:06.412789 < Content-Disposition: attachment; filename="api.txt" 00:12:06.412830 < X-Nexmo-Trace-Id: 9af96afd6c3b3271bf964d15390991f6 00:12:06.412871 < { "message-count": "1", "messages": [{ "to": "TO_NUMBER", "message-id": "0C000000A310D8CA", "status": "0", "remaining-balance": "230.56597167", "message-price": "0.03330000", "network": "23420" }] 00:12:06.413000 * Connection #0 to host rest.nexmo.com left intact }

Der Zusammenbruch

Wenn es Ihnen so geht wie mir und Sie vielleicht einen "Freund" haben, der eine Zeit lang das commandLineMyNemesis GitHub-Handle für eine Weile besaß, sollten Sie sich diese Ausgabe vielleicht noch einmal ansehen. Zerlegen wir sie in einzelne Schritte und sehen wir uns an, was jeder von ihnen tut.

DNS-Suche

* Trying 173.193.199.22... * TCP_NODELAY set * Connected to rest.nexmo.com (173.193.199.22) port 443 (#0)

Das von uns verwendete HTTPS-Protokoll spricht TCP (Transmission Control Protocol). Mit TCP muss cURL zuerst die IP-Adresse des angeforderten Hosts herausfinden: Trying 173.193.199.22..., dann eine Verbindung zu ihm herstellen: Connected to rest.nexmo.com (173.193.199.22) port 443 (#0). Dabei führt es einen TCP-Protokoll-Handshake.
Der '(#0)Teil zeigt an, welche interne Nummer cURL dieser Verbindung gegeben hat.

TCP_NODELAY ist set standardmäßig aktiviert, was eine Segmentpufferung ermöglicht, damit die Daten so schnell wie möglich gesendet werden können. Sie wird in der Regel verwendet, um die Netzauslastung zu erhöhen.

TLS-Verbindung

HTTPS steht für "Secure HTTP", was bedeutet, dass die TCP-Transportschicht erweitert wird, um Authentifizierung, Verschlüsselung und Datenintegrität unter Verwendung von TLS (Transport Layer Security) zu bieten.

Die TLS-Verbindung beginnt mit einem "Handshake", einer Verhandlung zwischen dem Client (cURL, das auf Ihrem PC läuft) und dem Server, in der die Details des weiteren Vorgehens geklärt werden. Der Handshake legt fest, welche Cipher Suite verwendet wird, verifiziert den Server und stellt sicher, dass eine sichere Verbindung hergestellt wird, bevor die eigentliche Datenübertragung beginnt.

* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

Wir sind darüber informiert, dass Nexmo die “TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256” aus den von uns angebotenen Chiffriersuiten auswählte. Das bedeutet, dass das ECDHE Protokoll gewählt wurde, wird es den RSA Public-Key-Algorithmus zur Verifizierung von Zertifikatsignaturen und zum Schlüsselaustausch, den AES Algorithmus in GCM um Daten zu verschlüsseln, und den SHA256 um den Inhalt von Nachrichten zu verifizieren.

Server-Zertifikate

* Server certificate: *.nexmo.com * Server certificate: DigiCert SHA2 Secure Server CA * Server certificate: DigiCert Global Root CA

Die Gewissheit, dass Sie mit dem richtigen Host kommunizieren, ist ebenso wichtig wie eine sichere Verbindung. Während des TLS-Handshakes erhält cURL das Zertifikat des entfernten Servers und überprüft dessen Signatur, indem es es mit seinem eigenen CA-Zertifikatspeicher vergleicht. Dies geschieht, um sicherzustellen, dass wir mit dem richtigen TLS-Server kommunizieren - der Nexmo-Server ist also tatsächlich der Nexmo-Server.

POST-Anfrage

POST /sms/json HTTP/1.1 Host: rest.nexmo.com User-Agent: curl/7.54.0 Accept: */* Content-Length: 124 Content-Type: application/x-www-form-urlencoded > * upload completely sent off: 124 out of 124 bytes

Eine von einem Client gesendete HTTP-Anfrage beginnt mit einer Anfragezeile: POST /sms/json HTTP/1.1gefolgt von Kopfzeilen und einem optionalen Textkörper, der von den Kopfzeilen durch eine Leerzeile getrennt ist.

Die Kopfzeilen der Anfrage enthalten Informationen über den Server, mit dem wir kommunizieren, über unsere Softwareversion, über die Inhaltstypen, die wir verstehen können, und über den Inhalt des Anfragekörpers.

Antwort-Kopfzeilen

< HTTP/1.1 200 OK < Server: nginx < Date: Tue, 03 Apr 2018 23:12:07 GMT < Content-Type: application/json < Transfer-Encoding: chunked < Connection: keep-alive < Cache-Control: max-age=1 < X-Frame-Options: deny < X-XSS-Protection: 1; mode=block; < Strict-Transport-Security: max-age=31536000; includeSubdomains < Content-Disposition: attachment; filename="api.txt" < X-Nexmo-Trace-Id: 9af96afd6c3b3271bf964d15390991f6 <

Die Anfrage, die wir gesendet haben, erhält eine entsprechende HTTP-Antwort vom Server. Sie enthält eine Reihe von Kopfzeilen und einen Antwortkörper, getrennt durch eine Leerzeile.

Die erste Zeile zeigt einen Statuscode, in diesem Fall, 200 OKan, der uns mitteilt, dass die Anfrage erfolgreich war.

Die Header enthalten Metadaten des Nexmo-Servers, die uns sagen, dass er nginx als Webserver-Plattform verwendet, dass er den Inhalt in einem JSON-Format zurücksendet und dass der Inhalt gechunked ist, so dass wir nicht mit einem Content-Length Header erwarten (wie cURL ihn im Request-Header sendet).

Der Connection: keep-alive Teil lässt uns wissen, dass TCP's keepalive Funktion verwendet wird. cURL tut dies standardmäßig, so dass "Ping-Frames" hin und her geschickt werden, wenn die Verbindung sonst völlig untätig wäre. Dies hilft, Unterbrechungen von Verbindungen zu erkennen, auch wenn kein Datenverkehr stattfindet, und hilft den Zwischensystemen zu verstehen, dass die Verbindung noch besteht.

Es gibt auch ein paar sicherheitsrelevante Header darin, X-Frame-Options: deny erlaubt es einem Browser nicht, diese URL in einem <frame>, <iframe> oder <object> darzustellen. Nexmo nutzt dies, um Clickjacking-Angriffe zu verhindern, indem sichergestellt wird, dass der Inhalt nicht in andere Websites eingebettet wird. X-XSS-Protection: 1; mode=block; aktiviert die XSS-Filterung, so dass der Browser das Rendering der Seite verhindert, wenn ein Angriff erkannt wird.

Die letzte Zeile ist leer, das ist die Markierung, die das HTTP-Protokoll verwendet, um das Ende der Header zu signalisieren.

Antwortstelle

{ "message-count": "1", "messages": [{ "to": "TO_NUMBER", "message-id": "0C000000A310D8CA", "status": "0", "remaining-balance": "230.56597167", "message-price": "0.03330000", "network": "23420" }] * Connection #0 to host rest.nexmo.com left intact }

Der Antwortkörper enthält Informationen über den gesendeten Text, beginnend mit der Anzahl der Nachrichten: "message-count": "1", gefolgt von einer "messages": Array von Objekten mit Details zu jeder einzelnen Nachricht. Die Elemente dieses Arrays sind wie folgt: die Nummer, an die die Nachricht gesendet wurde, die ID der Nachricht, der Status der Nachricht, das verbleibende Guthaben auf dem Nexmo Account, die Kosten der Nachricht und die ID des Empfängernetzes.

Connection #0 to host rest.nexmo.com left intact lässt uns wissen, dass die Verbindung nicht als Folge der Übertragung geschlossen wird. Sobald cURL jedoch zur Kommandozeile zurückkehrt, wird die Verbindung geschlossen.

Schlussfolgerung

Auch wenn es weniger als 2 Sekunden gedauert hat, eine SMS zu versenden, gibt es eine Menge, was auf den ersten Blick nicht zu erkennen ist. Ich hoffe, dass es mir gelungen ist, etwas Licht ins Dunkel zu bringen, und dass Sie jetzt besser verstehen, was bei einer HTTPS-Anfrage an die Nexmo SMS API wirklich passiert. Wenn Sie noch Fragen haben, die unbeantwortet geblieben sind, können Sie mich gerne mich auf Twitter zu erreichen.

Was kommt als Nächstes?

Wenn Sie noch tiefer in die genannten Technologien eintauchen möchten, sollten Sie sich diese Ressourcen ansehen Die ersten paar Millisekunden einer HTTPS-Verbindung, HTTP-Kopfzeilen, HTTP über TLS, Das TLS-Protokoll, Alles cURL und die Nexmo SMS API.

Teilen Sie:

https://a.storyblok.com/f/270183/372x373/36054b72d0/julia-biro.png
Julia BiroAdvokat für Entwickler

Julia hat es sich zur Aufgabe gemacht, andere Entwickler durch die Erstellung von Tutorials, Anleitungen und praktischen Ressourcen zu unterstützen. Mit ihrem Hintergrund in den Bereichen Öffentlichkeitsarbeit und Bildung möchte sie Technologien zugänglicher machen und die Erfahrung von Entwicklern insgesamt verbessern. Man kann sie oft bei lokalen Veranstaltungen antreffen.