https://a.storyblok.com/f/270183/83374/00e8a569d2/featured-img_http-curl-nexmo.png

cURL, HTTPS e a SMS API da Nexmo – Nos bastidores

Publicado em May 4, 2021

Tempo de leitura: 14 minutos

Enviar um SMS com a API da Nexmo é tão fácil quanto enviar uma solicitação para a URL: https://rest.nexmo.com/sms/json. Mas você já se perguntou o que acontece nos bastidores? Quando você faz uma solicitação pela Internet, o que seu computador faz? O que o servidor faz?

Essas são as perguntas que pretendemos responder a seguir; então, acompanhe se quiser conferir por conta própria.

Antes de começarmos

Antes de começarmos, você vai precisar de algumas coisas:

  • O cURL é uma ferramenta de linha de comando para enviar e receber dados.

Fazendo a solicitação HTTPS com o cURL

O envio de uma https solicitação para a SMS API da Nexmo é bem simples. Basta substituir as variáveis a seguir no exemplo abaixo, e a mensagem já estará a caminho.

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

Você pode executar o curl com opções de linha de comando para acompanhar a(s) URL(s). Essas opções fornecem informações ao curl sobre como você deseja que ele se comporte.

A documentação da Nexmo utiliza -d para enviar sequências de dados em uma solicitação POST a um servidor, e estamos adicionando -v/--verbose para ativar o modo detalhado.

Isso nos permite ver as informações adicionais fornecidas pelo mecanismo interno do curl, juntamente com todos os cabeçalhos que ele envia e recebe. Além disso, ao adicionar --trace-time para que o cURL anteponha a todas as saídas detalhadas um temporizador de alta resolução indicando o momento em que a linha foi impressa.

Agora, vamos dar uma olhada no resultado:

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 }

A Análise

Se você for como eu e talvez tenha um “amigo” que já teve o commandLineMyNemesis nome de usuário no GitHub por um tempo, talvez precise dar uma olhada melhor nesse resultado. Vamos dividir isso em etapas e ver o que cada uma delas faz.

Pesquisa de DNS

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

O protocolo HTTPS que usamos utiliza o TCP (Protocolo de Controle de Transmissão). Com o TCP, o cURL precisa primeiro descobrir o endereço IP do host solicitado: Trying 173.193.199.22..., e, em seguida, se conectar a ele: Connected to rest.nexmo.com (173.193.199.22) port 443 (#0). Ao fazer isso, ele realiza um handshake do protocolo TCP.
A parte '(#0)' indica qual número interno o cURL atribuiu a essa conexão.

TCP_NODELAY é set por padrão, o que habilita o buffer de segmentos para que os dados possam ser enviados o mais rápido possível. Geralmente é usado para aumentar a utilização da rede.

Conexão TLS

HTTPS significa “HTTP Seguro”, o que significa que a camada de transporte TCP foi aprimorada para oferecer autenticação, criptografia e integridade dos dados, utilizando o TLS (Transport Layer Security).

A conexão TLS começa com um “handshake”, uma negociação entre o cliente (o cURL em execução no seu PC) e o servidor que define os detalhes de como a conexão será estabelecida. O handshake determina qual conjunto de criptografia será usado, Verify o servidor e garante que uma conexão segura seja estabelecida antes do início da transferência de dados propriamente dita.

* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

Fomos informados de que a Nexmo escolheu “TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256” entre os conjuntos de criptografia que oferecemos. Isso significa que, ECDHE protocolo foi escolhido; ele utilizará o RSA algoritmo de chave pública para verificar assinaturas de certificados e trocar chaves, e o AES algoritmo para GCM para criptografar dados, e o SHA256 para verificar o conteúdo das mensagens.

Certificados de servidor

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

Ter certeza de que você está se comunicando com o servidor correto é tão importante quanto ter uma conexão segura. Durante o handshake TLS, o cURL obtém o certificado do servidor remoto e Verify sua assinatura, comparando-a com seu próprio repositório de certificados de autoridade certificadora (CA). Isso é feito para garantir que nos comunicamos com o servidor TLS correto — ou seja, que o servidor da Nexmo é de fato o servidor da Nexmo.

Solicitação POST

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

Uma solicitação HTTP enviada por um cliente começa com uma linha de solicitação: POST /sms/json HTTP/1.1, seguida pelos cabeçalhos e, opcionalmente, por um corpo, separado dos cabeçalhos por uma linha em branco.

Os cabeçalhos da solicitação contêm informações sobre o servidor com o qual estamos nos comunicando, a versão do nosso software, os tipos de conteúdo que podemos processar e sobre o conteúdo do corpo da solicitação.

Cabeçalhos de resposta

< 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 <

A solicitação que enviamos está recebendo uma resposta HTTP correspondente do servidor. Ela contém um conjunto de cabeçalhos e um corpo de resposta, separados por uma linha em branco.

A primeira linha mostra um código de status, neste caso, 200 OK, o que nos indica que a solicitação foi bem-sucedida.

Os cabeçalhos contêm metadados do servidor Nexmo, indicando que ele utiliza o nginx como plataforma de servidor web, que está enviando conteúdo no formato JSON e que o conteúdo é fragmentado; portanto, não devemos esperar um Content-Length cabeçalho (como o que o cURL enviou no cabeçalho da solicitação).

A Connection: keep-alive parte nos indica que o recurso do TCP keepalive está sendo usado. O cURL faz isso por padrão, de modo que “quadros de ping” são enviados de um lado para o outro quando a conexão, de outra forma, estaria totalmente ociosa. Isso ajuda conexões ociosas a detectar falhas mesmo na ausência de tráfego e ajuda os sistemas intermediários a entender que a conexão ainda está ativa.

Existem também alguns cabeçalhos relacionados à segurança ali, X-Frame-Options: deny não permitindo que um navegador exiba essa URL em um <frame>, <iframe> ou <object>. A Nexmo usa isso para evitar ataques de clickjacking, garantindo que seu conteúdo não seja incorporado a outros sites. X-XSS-Protection: 1; mode=block; Habilita a filtragem de XSS, de modo que o navegador impedirá a exibição da página caso seja detectado um ataque.

A última linha está vazia; esse é o marcador usado pelo protocolo HTTP para indicar o fim dos cabeçalhos.

Corpo da resposta

{ "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 }

O corpo da resposta contém informações sobre o texto que enviamos, começando pelo número de mensagens: "message-count": "1", seguido por uma "messages": matriz de objetos com detalhes sobre cada mensagem individual. Os elementos dessa matriz são os seguintes: o número para o qual a mensagem foi enviada, o ID da mensagem, o status da mensagem, o saldo restante na conta da Nexmo, o custo da mensagem e o ID da rede do destinatário.

Connection #0 to host rest.nexmo.com left intact isso nos indica que a conexão não está sendo encerrada como consequência da transferência. No entanto, assim que o cURL retornar à linha de comando, ela será encerrada.

Conclusão

Embora tenha levado menos de 2 segundos para enviar um SMS, há muito acontecendo além do que parece à primeira vista. Espero ter conseguido esclarecer um pouco sobre o funcionamento interno e que, a esta altura, você já tenha uma compreensão melhor do que realmente acontece durante uma solicitação HTTPS à SMS API da Nexmo. Se ainda tiver alguma dúvida que não tenha sido esclarecida, fique à vontade para me contatar no Twitter.

E agora?

Se você quiser se aprofundar ainda mais nas tecnologias mencionadas, não deixe de conferir estes recursos sobre Os primeiros milissegundos de uma conexão HTTPS, Cabeçalhos HTTP, HTTP sobre TLS, O Protocolo TLS, Tudo sobre o cURL e a SMS API da Nexmo.

Compartilhar:

https://a.storyblok.com/f/270183/372x373/36054b72d0/julia-biro.png
Julia BiroRepresentante de Desenvolvedores

Julia está empenhada em capacitar outros desenvolvedores por meio da criação de tutoriais, guias e recursos práticos. Com experiência em divulgação e educação, ela busca tornar a tecnologia mais acessível e aprimorar a experiência geral dos desenvolvedores. É comum encontrá-la em eventos da comunidade local.