tls que protocolo precio funciona como certificado security api authentication rest digital-signature

security - que - Asegurar una API: Autenticación básica de SSL y HTTP frente a la firma



ssl wikipedia (6)

Autenticación HTTP básica sobre SSL es perfectamente segura de mi investigación.

Después de todo, el uso de SSL (estrictamente TLS ahora) significa que la capa de transporte está encriptada y podemos suponer con seguridad que cualquier información que se transmita es segura y no ha sido alterada.

Por lo tanto, es suficiente pasar el nombre de usuario y la contraseña sin generar una firma.

Al diseñar una API para nuestra aplicación web, usaremos su subdominio como ''nombre de usuario'' y generaremos una clave API / secreto compartido. En primer lugar, ¿está bien usar el subdominio como nombre de usuario? No veo el beneficio de generar otra clave.

Diferentes API parecen hacer una de estas dos cosas:

  1. Usar autenticación básica HTTP con SSL

En cada solicitud, el nombre de usuario se establece en el subdominio y la contraseña de la clave API. Ya que estamos usando SSL, esto debería estar a salvo de la falsificación.

API notables: Google Checkout , Freshbooks , GitHub , Zendesk

  1. Crear una firma de la solicitud con el secreto compartido

Normalmente se logra ordenando los pares clave / valor y usando HMAC-SHA1 con el secreto compartido para generar la firma. La firma se envía con la solicitud y se verifica en el otro extremo.

API notables: Google Checkout , Amazon AWS

PD: eso no es un error, Google Checkout es compatible con ambos

Editar: Acabo de leer que OAuth 2 está soltando firmas a favor de enviar un nombre de usuario / contraseña a través de SSL.

Cualquier opinión de cualquier persona sobre qué elegir: SSL vs Signature?


El problema de Heartbleed con OpenSSL ilustra las posibles dificultades de confiar únicamente en SSL para asegurar una API. Dependiendo del uso de la API y las implicaciones si el transporte SSL se ve comprometido, es posible que se necesiten medidas de seguridad adicionales, como se menciona en la respuesta de Emboss.


Está bien usar un subdominio como nombre de usuario, siempre que haya algún tipo de secreto.

El beneficio de usar un secreto compartido es que la ''parte'' que realiza la solicitud no necesita conocer el secreto, solo necesita saber la firma para realizar la solicitud. Esto es beneficioso si desea que sus usuarios permitan que las solicitudes se realicen a través de un navegador, por ejemplo.

Con S3 puede crear una firma, enviarla al navegador y cargar directamente desde un navegador a S3.

También podría usar HTTP Digest, que tiene beneficios de ambos. Todavía puede probar fácilmente la API en un navegador, porque los navegadores son compatibles con Digest y Basic, y nunca se envía una contraseña de texto sin formato.


La respuesta de Igor no es del todo cierta. Aunque TLS asegura que la capa de transporte está encriptada y es segura, aún no es tan segura como el uso de, por ejemplo, TLS con autenticación mutua, donde el cliente se autentica usando "criptografía fuerte" en forma de firma digital. Hay dos razones principales por las cuales esto es aún mejor que la Autenticación básica sobre TLS:

  • Las contraseñas son contraseñas y supongo que tres de los ahora 7 mil millones de personas en nuestro planeta usan una contraseña de 30 caracteres que es completamente aleatoria. El resto de nosotros eligió algo con mucha menos entropía. Por lo tanto, es mucho más fácil para un atacante aplicar fuerza bruta a un servicio que utiliza contraseñas en lugar de firmas digitales.

  • Uno podría argumentar que para las firmas digitales del lado del cliente también hay una contraseña involucrada, para acceder a la clave privada por lo general. Pero esta es una situación muy diferente a la que tenemos con Basic Auth: primero, la clave privada reside como recurso en la máquina del cliente, por lo que incluso si se recupera, solo afectará a una persona en lugar de a todos y, segundo, a la clave típica formatos de contenedor como PKCS # 12 también hay Cifrado basado en contraseña utilizado para acceder a la clave. Estos algoritmos fueron diseñados específicamente para frenar a los atacantes y reducir su tasa de intentos de fuerza bruta por unidad de tiempo, una ventaja adicional para las firmas digitales.

No hay duda de que TLS Basic Auth es mucho más conveniente de configurar y usar, pero para entornos de alta seguridad siempre preferiría una "criptografía sólida" sobre las soluciones de usuario / contraseña, vale la pena.


Me gustaría señalar algunas cosas mencionadas en security.stackexchange.com ya que dice "Autenticación HTTP básica sobre SSL es perfectamente segura de mi investigación". Podría argumentar que los puntos 3 y 4 a continuación rara vez son válidos para las API REST, pero realmente depende de cómo se implementen.

"Hay algunos problemas con la autenticación básica HTTP:

  • La contraseña se envía por cable en la codificación base64 (que se puede convertir fácilmente en texto sin formato).
  • La contraseña se envía repetidamente para cada solicitud. (Ventana de ataque más grande)
  • La contraseña es almacenada en caché por el navegador web, como mínimo durante la duración de la ventana / proceso. (Puede ser reutilizado silenciosamente por cualquier otra solicitud al servidor, por ejemplo, CSRF).
  • La contraseña puede almacenarse permanentemente en el navegador, si el usuario
    peticiones. (Igual que el punto anterior, además podría ser robado por
    otro usuario en una máquina compartida).

De esos, usar SSL solo resuelve el primero. E incluso con eso, SSL solo protege hasta el servidor web: cualquier enrutamiento interno, registro de servidor, etc. verá la contraseña de texto sin formato.

Entonces, como con cualquier cosa, es importante mirar la imagen completa. ¿HTTPS protege la contraseña en tránsito? - Sí.

¿Es suficiente? Por lo general, no. (Quiero decir, siempre no, pero realmente depende de lo que su sitio es y de lo seguro que debe ser).


Respondiendo sobre un hilo viejo ya que nadie realmente tocó el punto principal

SSL / TLS es fundamentalmente defectuoso, como todas las PKI, ya que dependen de una cadena de confianza que se ha demostrado cada vez más susceptible a ataques MiM :

  • Las autoridades de certificación han sido y pueden ser pirateadas. Un ejemplo entre muchos es el caso de DigiNotar donde una CA se vio comprometida durante meses antes de que se reconociera el incumplimiento de todos los certificados revocados. Mientras tanto, el gobierno iraní había falsificado buenos certificados SSL válidos para google.com, facebook.com, twitter.com, etc.

  • Herramientas de filtrado proxy de la compañía como Zscaler que descifran y vuelven a encriptar todo el tráfico sobre la marcha para "propósitos de seguridad" no especificados. Ver esta pregunta / respuesta en SO

  • Los errores con la implementación SSL más común (openSSL) se descubren todo el tiempo (¿pero las cosas deberían mejorar con el tiempo?)

Por lo tanto, a los grandes jugadores no les gusta confiar solo en SSL:

En esos casos, un token de HMAC no le otorga confidencialidad, pero no le permitirá a quien sea que lo está espiando forjar solicitudes con sus credenciales , que de otro modo serían triviales si las pasara a través de la autenticación básica.

Una alternativa al modelo de PKI es la Web de confianza que no depende de una sola autoridad para verificar la autenticidad de los certificados, sino más bien de la opinión brindada por la mayoría de los pares conocidos o de confianza O bien, pares conocidos pero no necesariamente confiables

Este modelo aún no es perfecto, ya que está sujeto al notorio 51% de ataque exactamente igual al Bitcoin Blockchain (que es un ejemplo de un modelo confiable distribuido)