Firmar las solicitudes de la API con una clave privada: ¿Este escenario de entrega de claves parece seguro?

0

Soy un desarrollador de software pero un novato en lo que respecta a la seguridad en línea.

La empresa A tiene algún software de escritorio utilizado por los clientes C y D (C no relacionado con D).
La empresa B tiene un servicio web y tiene la misma C & D clientes.

C & D necesita el software de A para conectarse al servicio web de B e importar sus datos específicos.

A contacta a B y pregunta qué se necesita para lograr esto y se le dice que haga lo siguiente: -
1) Crear una clave privada
- openssl genrsa -aes256 -out chosencertificatename.key.pem 2048
- (agregar una contraseña cuando se le solicite)

2) Crear una CSR
- openssl req -key chosencertificatename.pem -new -sha256 -out chosencertificatename.csr.pem - (ingrese la información relevante para el certificado)

3) Envíe el CSR a B y obtenga un certificado de vuelta
- Se le emitirá un certificado válido para acceder a las API.
- También se emitirá la cadena de certificado utilizada para firmar la solicitud.

4) Asocie su clave privada utilizando un archivo PKCS12
- openssl pkcs12 -export -out your_pkcs12_file.p12 -inkey your_private_key_store.pem -en certificate_sent_from_nucleus.pem

5) Use en su aplicación
- Insertar el certificado en su solicitud
- Cada solicitud debe contener el certificado del cliente (X509?) - Cada solicitud también debe contener un encabezado X-USERNAME para identificar al cliente
   (C y D recibirán sus propios tokens de nombre de usuario, ¿ID de texto simple?)

No estoy seguro de que esto parezca seguro ya que me parece que el certificado solo puede identificar que el software de A generó la solicitud; El encabezado X parece identificar solo los datos a devolver: si C descubre el NOMBRE DE USUARIO DE D, entonces pueden acceder a los datos de D, que parecen incluso menos seguros que la ID de usuario / contraseña.

Además, ¿es seguro pasar un certificado que tiene una clave privada incrustada?

Editar: Al volver a leer las instrucciones enviadas por B, parece que A también necesita informar a B a qué clientes requieren acceso, y B puede escribir a esos clientes confirmando su permiso para acceder a los datos a través de la API.
¿Podría ser que el certificado devuelto por B contiene una lista incrustada de los X-USERNAMES validados?

    
pregunta Simon Hewitt 17.07.2017 - 12:02
fuente

3 respuestas

1
  

Si C descubre el NOMBRE DE USUARIO DE D, entonces pueden acceder a los datos de D que parecen ser incluso menos seguros que el ID de usuario / contraseña.

¿Pueden ellos? B podría generar un certificado separado para cada cliente que solo se puede utilizar para acceder a sus datos. El encabezado del nombre de usuario X puede ser simplemente metadatos. Pero es posible que desee probar esto para estar seguro. Especialmente cuando no preguntan a qué cliente deben firmar el certificado.

    
respondido por el Philipp 17.07.2017 - 14:40
fuente
1

La empresa A como proveedor de software deberá asegurarse de que:

Con certificado integrado:

  • A envía un CSR separado a B con una clave diferente para cada cliente C y D.
  • A incrusta la clave privada respectiva en el ejecutable antes entrega a C o D. Esto expone la clave privada durante la entrega.

Sin certificado suministrado (solución alternativa)

  • El propio cliente presenta una CSR con su clave generada en B
  • A simplemente entrega el software sin una clave, pero el requisito de importar una clave antes de usarla.

De cualquier manera, la clave privada nunca debe viajar a B. Esto no es un requisito, solo la clave pública debe estar firmada. La solución alternativa es más robusta con muchos clientes y asume el riesgo de fugas clave de la Compañía A.

    
respondido por el Marcel 17.07.2017 - 14:52
fuente
1

¡Ni siquiera intentes autenticar aplicaciones, solo autentican usuarios! Y si desea procedimientos serios de gestión de PKI, una clave privada siempre debe estar bajo el control exclusivo de su propietario: es un requisito clave para la no repudio. Si A crea la CSR y luego de que B la firma se los entrega a C y D, un administrador de la compañía A podría guardar una copia de las claves privadas y luego realizar cualquier operación en nombre de C y D.

El uso forzado de software de una compañía debe cuidarse a nivel legal, no técnico. Solo la autenticación C y D debe estar garantizada por certificados.

Y si cree que sus requisitos de seguridad le permiten a una compañía crear las claves privadas para C y D, entonces entiendo que solo necesita autenticación con contraseña y el uso de PKI es excesivo y no agrega seguridad adicional.

Lo siguiente no es más que mi propia opinión de lo que podría ser una forma posible. Primero, crear un certificado completo en A (incluida la clave privada) y enviarlo como un archivo PKCS12 a C y D es definitivamente una mala práctica y debe evitarse. Pero como A proporciona un software de escritorio a sus clientes, la generación del certificado podría incluirse en el procedimiento de instalación:

  • el procedimiento de instalación genera un par de claves (automáticamente, con la ayuda de la biblioteca OpenSSL)
  • solicita al cliente una identificación (por ejemplo, un número de licencia), un nombre y los incluye en una CSR
  • la CSR se envía a A (con HTTPS), firmada automáticamente por A después de que se haya controlado la ID y el certificado (sin la clave) sea almacenado por A indexado por la ID. Si un certificado antiguo se asoció con esa ID, se revoca (según los requisitos de su negocio, esta parte podría requerir un procedimiento manual ...)
  • el certificado firmado por A se devuelve al procedimiento de instalación
  • el procedimiento de instalación almacena el certificado en el almacén del sistema (asumiendo Windows aquí); normalmente se requiere que el usuario valide el UAC

Una vez hecho esto, el cliente tiene un certificado firmado por A y la clave nunca ha salido de la máquina cliente

En otro lado, A le proporciona a B su propio certificado de firma (¡no la clave!), y una dirección de lista de revocación de certificados o cualquier otra forma de controlar si un certificado ha sido revocado

Cuando un cliente desea usar el servicio web de B con el software A, puede autenticar su conexión HTTPS con su certificado: un software sabe cómo usarlo porque el procedimiento de instalación lo ha instalado. B puede validar el certificado con el de A, e incluso puede controlar que el certificado no haya sido revocado.

La separación de responsabilidad es:

  • A es responsable de la PKI: firmando certificados de clientes, manteniendo una CRL y la lista de los clientes
  • B es responsable de su servicio web. Se basan en A para la seguridad de los certificados (certificado de enlace < - > cliente)
  • C & D es responsable de la seguridad de su clave privada. Deben poder solicitar un nuevo certificado si se compromete a perderlo al reiniciar (parte de) el procedimiento de instalación. En ese caso, el anterior debe alimentar la CRL

Como solo los procedimientos automáticos están involucrados en la generación de certificados, todavía estamos lejos de los verdaderos requisitos de no rechazo, y el programa de instalación requerirá algún trabajo pero:

  • esto se basa en los procedimientos y protocolos de certificados X509 estándar
  • las responsabilidades o A, B y C & D son claras
respondido por el Serge Ballesta 17.07.2017 - 16:02
fuente

Lea otras preguntas en las etiquetas